GVKun编程网logo

如何将Sitemesh 3与Spring MVC 3集成在一起?(spring mvc和ssm)

24

针对如何将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)

如何将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

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"/>  
  <!--&lt;!&ndash;删除无效session&ndash;&gt; -->  
  <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>

这里配置结束之后,需要再将sessionManagerrememberMeManager配置进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:它们如何结合在一起?

asp.net-mvc – ASP.NET MVC2和MemberShipProvider:它们如何结合在一起?

我有一个包含大量用户和大型数据库的现有ASP.NET应用程序.现在我想在MVC 2中使用它.我不想迁移,我从头开始或多或少地进行迁移.我想保留的数据库,而不是太多.

我已经有了我的数据库表,我也希望将LINQ保留在sql层.我在当前的实现中没有使用MembershipProvider(在ASP.NET 1.0中没有得到强烈支持).

所以,要么我写自己的Membershipprovider来满足我的数据库和应用程序的需要,要么我根本不使用membershipprovider.

如果我不使用会员提供者,我想了解后果.与此相关的是什么?据我所知,在ASP.NET中,Login-Controls链接到提供者.可以轻松更改使用MVC2自动生成的AccountModel以支持我现有的逻辑.

当用户被AuthCookie识别时会发生什么? MVC是否使用MembershipProvider?

我忽略了什么吗?
我对RoleProvider有同样的问题.

非常感谢输入.

解决方法

使用MVC,可以简单地绕过成员资格和角色提供程序框架.有时这样做比实现自定义成员资格/角色提供程序更容易,特别是如果您的authn / authz模型不太适合这些提供程序的模型.

首先,您应该意识到您不需要从头开始编写所有内容,您可以使用核心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 – 如何将依赖注入到重写方法

asp.net-mvc – MVC3,Ninject,MvcSiteMapProvider – 如何将依赖注入到重写方法

我有一个使用 Ninject和 MvcSiteMapProvider的MVC3应用程序.

我创建了这个类,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.但到目前为止,这不是最佳解决方案,因为您应该尽可能地让实例接近根,这会使测试变得更加复杂,并且它只为您解决问题.

asp.net-mvc – 为什么InitializeSimpleMembershipAttribute在MVC 4应用程序

asp.net-mvc – 为什么InitializeSimpleMembershipAttribute在MVC 4应用程序

我认为我对SimpleMembershipProvider的理解差不多60%,其余的知道它是如何在内部工作的。

你可以很快地发现一些问题,当使用[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应用程序等相关内容,可以在本站寻找。

本文标签: