针对如何将Sitemesh3与SpringMVC3集成在一起?和springmvc和ssm这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展08.关于shiro集成Spring、SpringM
针对如何将Sitemesh 3与Spring MVC 3集成在一起?和spring mvc和ssm这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展08.关于shiro集成Spring、SpringMvc、SpringData实现remenberMe、asp.net-mvc – ASP.NET MVC2和MemberShipProvider:它们如何结合在一起?、asp.net-mvc – MVC3,Ninject,MvcSiteMapProvider – 如何将依赖注入到重写方法、asp.net-mvc – 为什么InitializeSimpleMembershipAttribute在MVC 4应用程序等相关知识,希望可以帮助到你。
本文目录一览:- 如何将Sitemesh 3与Spring MVC 3集成在一起?(spring mvc和ssm)
- 08.关于shiro集成Spring、SpringMvc、SpringData实现remenberMe
- asp.net-mvc – ASP.NET MVC2和MemberShipProvider:它们如何结合在一起?
- asp.net-mvc – MVC3,Ninject,MvcSiteMapProvider – 如何将依赖注入到重写方法
- asp.net-mvc – 为什么InitializeSimpleMembershipAttribute在MVC 4应用程序
如何将Sitemesh 3与Spring MVC 3集成在一起?(spring mvc和ssm)
我正在尝试使用Sitemesh 3来控制Spring MVC应用程序对JSP输出的装饰。
当我点击该应用程序时,似乎Sitemesh正在向Spring
servlet发出请求以尝试获取其装饰器文件。这可能是正确的行为,也可能不是正确的行为,但这使我头疼不已。
我对Sitemesh 3的理解是,它在Spring之后即在Response对象上进行工作。
我在浏览器中遇到的错误是404和日志中的错误(如下配置/代码):
INFO: Server startup in 1367 msDEBUG: org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name ''springiness'' processing GET request for [/clientmanager/]^MDEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Looking up handler method for path /^MDEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Returning handler method [public java.lang.String uk.co.hermes.HomeController.home(java.util.Locale,org.springframework.ui.Model)]^MDEBUG: org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean ''homeController''^MDEBUG: org.springframework.web.servlet.DispatcherServlet - Last-Modified value for [/clientmanager/] is: -1^MINFO : uk.co.hermes.HomeController - Welcome home! The client locale is en_GB.^MDEBUG: org.springframework.beans.factory.support.DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name ''home''^MDEBUG: org.springframework.web.servlet.DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name ''home''; URL [/WEB- INF/jsp/home.jsp]] in DispatcherServlet with name ''springiness''^MDEBUG: org.springframework.web.servlet.view.JstlView - Added model object ''serverTime'' of type [java.lang.String] to request in view with name ''home''^MDEBUG: org.springframework.web.servlet.view.JstlView - Forwarding to resource [/WEB- INF/jsp/home.jsp] in InternalResourceView ''home''^MDEBUG: org.springframework.web.servlet.DispatcherServlet - Successfully completed request^MDEBUG: org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name ''springiness'' processing GET request for [/clientmanager/WEB- INF/decorators/mainDecorator.html]^MDEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Looking up handler method for path /WEB-INF/decorators/mainDecorator.html^MDEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Did not find handler method for [/WEB-INF/decorators/mainDecorator.html]^MWARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/clientmanager/WEB-INF/decorators/mainDecorator.html] in DispatcherServlet with name ''springiness''^MDEBUG: org.springframework.web.servlet.DispatcherServlet - Successfully completed request^M
我怀疑这是我的web.xml中的问题,以及如何定义映射(URL):
<servlet> <servlet-name>springiness</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>springiness</servlet-name> <url-pattern>/</url-pattern></servlet-mapping><filter> <filter-name>sitemeshfilter</filter-name> <filter-class>uk.co.hermes.filters.SitemeshFilter</filter-class></filter><filter-mapping> <filter-name>sitemeshfilter</filter-name> <!-- leaving SitemeshFilter class to decide which responses it should decorate --> <url-pattern>/*</url-pattern></filter-mapping>
我的自定义过滤器:
public class SitemeshFilter extends ConfigurableSiteMeshFilter {private Logger log = LoggerFactory.getLogger(SitemeshFilter.class);/** * See http://wiki.sitemesh.org/display/sitemesh3/Configuring+SiteMesh+3 */@Overrideprotected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {log.debug("** hit the sitemesh filter"); // apply this decorator (template) to the path defined... builder.addDecoratorPath("/*", "/WEB-INF/decorators/mainDecorator.html"); // ... when the response type matches one of these builder.setMimeTypes("text/html", "application/xhtml+xml", "application/vnd.wap.xhtml+xml");
}}
WEB-INF / | | -jsp | -home.jsp | -decorators | -mainDecorator.html
我的超级简单控制器:
@RequestMapping(value = "/", method = RequestMethod.GET)public String home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); model.addAttribute("serverTime", formattedDate ); return "home";}
答案1
小编典典由于没有人发布实际内容,因此您可以执行以下操作:
在pom.xml
添加:
<dependency> <groupId>org.sitemesh</groupId> <artifactId>sitemesh</artifactId> <version>3.0.0</version></dependency>
在WEB-INF/web.xml
†中添加:
<filter> <filter-name>sitemesh</filter-name> <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class></filter><filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
在WEB-INF/sitemesh3.xml
添加:
<sitemesh> <mapping path="/*" decorator="/WEB-INF/decorator1.jsp"/></sitemesh>
在WEB-INF/decorator1.jsp
添加:
<html> <head> ... </head> <body> <sitemesh:write property=''body''/> </body></html>
†如果使用Spring Security,请将其放在Spring Security过滤器链的下方。
08.关于shiro集成Spring、SpringMvc、SpringData实现remenberMe
今天写登录功能,想要实现记住我功能,然后到处找了一些,始终不够完整,于是我就自己研究了最终实现如下
1.在登录页面加入“记住我”复选框,如下
<input type="checkbox" name="rememberMe" value="true">记住我</input>
需要注意的是,这里的name,只能写为remeberMe,因为shiro内部集成了会自动获取这个字段的值,后面的value="true"
,这个是我自己加上去的,相当于是一个默认值,默认为记住我状态
2.后台Controller里面接收参数:
//获取当前登录主体
Subject subject = SecurityUtils.getSubject();
//如果当前用户还没有认证
try {
//如果当前主体未认证,就开始认证
if (!subject.isAuthenticated()) {
//将传入的用户名和密码封装到UsernamePasswordToken
subject.login(token);
Employee employee = (Employee) subject.getPrincipal();
//登录成功之后将当前用户对象放到session中去
SessionUtil.setUserSession(employee);
//记住我
token.setRememberMe(true);
}
return new AjaxResult();
需要注意的是,我做的是在这里登录成功之后,就直接就setRememberMe(true)
,当然,这里可以自己加判断,有if语句和三目都可以实现,基于你的需求不一样而已。
3.配置权限
我这里是自定义的map集合来动态获取数据库中的权限,以及添加新的权限请求,如果需要具体配置的方法介绍,可以留言
public class MyFilterChainDefinitionMap {
@Autowired
private IPermissionService permissionService;
/**
* 动态获取数据库中的权限
* @return
*/
public Map<String,String> createMap(){
//准备一个map集合
Map<String,String> map = new LinkedHashMap<>();
//通过注入的IPermissionService对象来查找出所有的Permission(权限对象)
List<Permission> permissionList = permissionService.findAll();
//循环遍历所有的Permission
for (Permission permission : permissionList) {
//在过程中,动态添加权限 --//url(=== /employee/save) 对应 sn(=== employee:save) //ArvinPermission是自定义的过滤器
map.put(permission.getUrl(),"ArvinPermission["+permission.getSn()+"]");
}
//直接放行登录请求
map.put("/login","anon");
//这里用于对所有的静态资源进行放行
map.put("/static/**","anon");
//注销请求
map.put("/logout","logout");
//拦截所有请求,需要认证才能通行
//map.put("/**","authc");
// --- /** = user 表示对访问所有地址对认证过的用户进行放行
map.put("/**","user");
return map;
}
}
在这个里面就是将原来的map.put("/**","authc");
替换为map.put("/**","user");
,相当于原来所有的请求都需要认证,而现在就是所有的请求对认证过的主体进行放行(不等于不需要权限访问所有链接)
4.shiro.xml配置
<bean id="rememberMeCookie">
<!--设置cookie的名称-->
<constructor-arg value="rememberMe"/>
<property name="httpOnly" value="true"/>
<!--30*24*60*60 = 2592000(天*小时*分钟*秒钟) 设置cookie的存活时间 -->
<property name="maxAge" value="2592000"/><!-- 30 天 -->
</bean>
<!-- rememberMe 管理器 -->
<!--rememberMe 管理器,cipherKey 是加密 rememberMe Cookie 的密钥;默认 AES 算法-->
<bean id="rememberMeManager">
<property name="cipherKey" value=" #{T(org.apache.shiro.codec.Base64).decode(''4AvVhmFLUs0KTA3Kprsdag=='')}"/>
<property name="cookie" ref="rememberMeCookie"/>
</bean>
<!-- 会话ID生成器 -->
<bean id="sessionIdGenerator"/>
<!-- 会话Cookie模板,使用sid存储sessionid -->
<bean id="sessionIdCookie">
<constructor-arg value="sid"/>
<property name="httpOnly" value="true"/>
<!--这里就是设置的一次会话管半个小时-->
<property name="maxAge" value="180000"/>
</bean>
<!-- 会话DAO -->
<bean id="sessionDAO">
<property name="activeSessionsCacheName" value\="shiro-activeSessionCache"/>
<property name="sessionIdGenerator" ref="sessionIdGenerator"/>
</bean>
<!-- 会话验证调度器 -->
<bean id="sessionValidationScheduler">
<property name="sessionValidationInterval" value="1800000"/>
<property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- 会话管理器 -->
<bean id="sessionManager">
<!--失效时间,单位为毫秒-->
<property name="globalSessionTimeout" value="1800000"/>
<!--<!–删除无效session–> -->
<property name="deleteInvalidSessions" value="true"/>
<property name="sessionValidationSchedulerEnabled" value="true"/>
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
<property name="sessionDAO" ref="sessionDAO"/>
<property name="sessionIdCookieEnabled" value="true"/>
<property name="sessionIdCookie" ref="sessionIdCookie"/>
</bean>
这里配置结束之后,需要再将sessionManager
和rememberMeManager
配置进shiro的核心对象securityManager
中
<bean id="securityManager">
<property name="realm" ref="arvinRealm"/>
<property name="sessionManager" ref="sessionManager"/>
<!--引入记住我属性-->
<property name="rememberMeManager" ref="rememberMeManager"/>
</bean>
到这里,我们的记住我功能就全部实现
asp.net-mvc – ASP.NET MVC2和MemberShipProvider:它们如何结合在一起?
我已经有了我的数据库表,我也希望将LINQ保留在sql层.我在当前的实现中没有使用MembershipProvider(在ASP.NET 1.0中没有得到强烈支持).
所以,要么我写自己的Membershipprovider来满足我的数据库和应用程序的需要,要么我根本不使用membershipprovider.
如果我不使用会员提供者,我想了解后果.与此相关的是什么?据我所知,在ASP.NET中,Login-Controls链接到提供者.可以轻松更改使用MVC2自动生成的AccountModel以支持我现有的逻辑.
当用户被AuthCookie识别时会发生什么? MVC是否使用MembershipProvider?
我忽略了什么吗?
我对RoleProvider有同样的问题.
非常感谢输入.
解决方法
首先,您应该意识到您不需要从头开始编写所有内容,您可以使用核心Forms身份验证API,它可以独立于成员资格/角色提供程序框架使用:
> FormsAuthentication.SetAuthCookie –
用户访问后调用此方法
经过身份验证,请指定用户名
> Request.IsAuthenticated – 退货
如果调用SetAuthCookie,则为true
> HttpContext.Current.User.Identity.Name – 返回在调用SetAuthCookie时指定的用户名
所以这是你在MVC中绕过会员/角色提供者所做的事情:
>身份验证:在您的身上控制器,验证用户使用您的自定义逻辑.如果成功,打电话FormsAuthentication.SetAuthCookie用户名.>授权:创建自定义授权属性(源自AuthorizeAttribute).在里面AuthorizeCore覆盖,实现你的自定义授权逻辑,吸引用户HttpContext.Current.User.Identity.Name以及角色中定义的角色AuthorizeAttribute基类的属性.请注意,您还可以在自定义上定义属性授权属性并在授权逻辑中使用它.例如,您可以将表示角色的属性定义为枚举值特定于您的应用程序,而不是使用仅仅是字符串的Roles属性.>将您的控制器和操作添加到您的自定义授权属性,而不是默认的授权属性.
asp.net-mvc – MVC3,Ninject,MvcSiteMapProvider – 如何将依赖注入到重写方法
我创建了这个类,MvcSiteMapProvider使用它来动态地将节点添加到我的站点地图:
public class PageNodeProvider : DynamicNodeProviderBase { public override IEnumerable<DynamicNode> GetDynamicNodeCollection() { // need to get repository instance var repository = // how do I get this??? foreach (var item in repository.GetItems()) { yield return MakeDynamicNode(item); } } }
MvcSiteMapProvider本身实例化了这个类型,所以我不确定如何将我的存储库注入其中.
我想通过在我的内核上获取句柄并在方法中调用Get< Repository>()来考虑使用服务位置.但是,在查看NinjectHttpApplication的定义时,我看到了这个属性:
// Summary: // Gets the kernel. [Obsolete("Do not use Ninject as Service Locator")] public IKernel Kernel { get; }
不要使用Ninject作为服务定位器?!我该怎么办呢?
然后我找到this question here on stackoverflow并且所有答案都说不要使用服务位置.
我应该做些什么?
解决方法@H_301_19@
这似乎是“为什么提供商是糟糕的设计?”一书的另一章.您遇到与任何类型的ASP.NET提供程序相同的问题.对他们来说,没有真正好的和令人满意的解决方案.只是黑客.
我认为你最好的选择是分叉项目并更改DefaultSiteMapProvider以使用DepencencyResolver而不是Activator,并将实现提供回社区.然后,您可以在PageNodeProvider实现中使用构造函数注入.这将解决所有类型和每个人的问题.
当然,您也可以在实现中使用DependencyResolver.但到目前为止,这不是最佳解决方案,因为您应该尽可能地让实例接近根,这会使测试变得更加复杂,并且它只为您解决问题.
我认为你最好的选择是分叉项目并更改DefaultSiteMapProvider以使用DepencencyResolver而不是Activator,并将实现提供回社区.然后,您可以在PageNodeProvider实现中使用构造函数注入.这将解决所有类型和每个人的问题.
当然,您也可以在实现中使用DependencyResolver.但到目前为止,这不是最佳解决方案,因为您应该尽可能地让实例接近根,这会使测试变得更加复杂,并且它只为您解决问题.
asp.net-mvc – 为什么InitializeSimpleMembershipAttribute在MVC 4应用程序
你可以很快地发现一些问题,当使用[InitializeSimpleMembership]过滤器只有在AccountController(默认模板)。我认为在任何地方使用Memberhsip API或WebMatrix.WebSecurity,你需要确保这个过滤器应该首先调用。
后来,如果你在我的_Layout.cshtml中使用User.IsInRole。您需要将过滤器应用于所有控制器,然后您开始在全局中注册它。
但是我只是意识到有LazyInitializer.EnsureInitialized使初始化只执行一次每个应用程序启动。
那么为什么SimpleMembershipInitializer(在过滤器中)不直接在Application_Start中?
有什么理由使用过滤器吗?
解决方法
对于大多数实际目的,最好只是在App_Start中完成。
关于如何将Sitemesh 3与Spring MVC 3集成在一起?和spring mvc和ssm的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于08.关于shiro集成Spring、SpringMvc、SpringData实现remenberMe、asp.net-mvc – ASP.NET MVC2和MemberShipProvider:它们如何结合在一起?、asp.net-mvc – MVC3,Ninject,MvcSiteMapProvider – 如何将依赖注入到重写方法、asp.net-mvc – 为什么InitializeSimpleMembershipAttribute在MVC 4应用程序等相关内容,可以在本站寻找。
本文标签: