Spring MVC servlet、filter和sitemesh配置问题

Posted on 2016-01-12 16:02  っ蜉蝣  阅读(1056)  评论(0)    收藏  举报

本文共记录三个问题,有责共勉。基于XML配置方式的Spring MVC。Java类配置流的可以忽略。

1.Servlet开始。正常配置:

<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
错误配置:
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
出现问题的现象如图,自动把返回的代码加到了<pre>标签里:

2.session filter 和sitemesh

这里不给出错误的配置,sitemesh怎么配置自己去搜,基于sitemesh已经正常运行来说明。只贴出正确的代码,然后进行说明

如图添加了 session filter

<filter>
<filter-name>sessionFilter</filter-name>
<filter-class>com.zsf.monkey.filters.LoginFilter</filter-class>
<init-param>
<param-name>excludedPages</param-name>
<param-value>userLogin,static</param-value> ----不进行filter验证的请求路径
</init-param>
</filter>
<filter-mapping>
<filter-name>sessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!--sitemesh-->
<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>

下面是LoginFilter类
public class LoginFilter extends GenericFilterBean {

/**
* 需要排除的页面
*/
private String excludedPages;

private static String[] excludedPageArray;

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
boolean isExcludedPage = false;
for (String page : excludedPageArray) {//判断是否在过滤url之外
if (request.getServletPath().indexOf(page)>0) { //这里网上的demo给出的都是 request.getServletPath.equals(page),这里之所以换成indexof,是因为css,js等文件的请求也会进这里,所以<param-value>userLogin,static</param-value> 这里面给的参数就是,第一个就是登陆的action,第二个就是静态文件所在的文件夹
                isExcludedPage = true;
break;
}
}
if (isExcludedPage) {//在过滤url之外
filterChain.doFilter(servletRequest, servletResponse);
} else {//不在过滤url之外,判断session是否存在
// 从session中获取登录者实体
Object obj = request.getSession().getAttribute("user");
if (null == obj) {
((HttpServletResponse) servletResponse).sendRedirect("/home/userLogin");
return;
}
}
}

/**
* 初始化函数,获取需要排除在外的url
*/
@Override
public void initFilterBean() { //这个方法是GenericFilterBean 的重构,会在tomcat启动的时候执行,在这里的作用就是在启动的时候就把要排除的url加载进来,网上的demo大多没重写这个方法,直接在doFilter里定义了一个数组,这样写low爆了
        FilterConfig filterConfig = getFilterConfig();
excludedPages = filterConfig.getInitParameter("excludedPages");
if (StringUtils.isNotEmpty(excludedPages)) {
excludedPageArray = excludedPages.split(",");
}
}


}


ok,到此为止。本人半路出家,路子可能比较野,希望能给大家一些帮助,然后也希望大家不吝赐教,指教不足。