SpringMVC的过滤和Struts2的过滤差不多
1.编写过滤器类(继承OncePerRequestFilter这个类,实现
doFilterInternal这个抽象方法
) strtus2通常是实现filter接口
SessionFilter:过滤掉非法请求(用户未登录)
package com.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
public class SessionFilter extends OncePerRequestFilter{
/**
* 当用户session过期,禁止用户访问特殊页面
*/
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
//检测session是否有该用户
if(request.getSession().getAttribute("user")==null){//未登录
//定义游客请求接口:格式 a.do,b.do,c.do
String sb="home,regist,login,existsuser,jobdetail";
//访问游客页面,自动重定向到主页
String uri=request.getRequestURI();
String action=uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf("."));
if(!sb.contains(action)){//请求了非法请求
response.sendRedirect("/SSM/user/home.do");
}
}
//登录的用户直接通过
chain.doFilter(request, response);
}
}
//JSPFilter:过滤掉所有jsp页面访问(tip:严格来说是这样的,所有的请求都应该经过服务器,不应该让用户直接访问jsp资源,这属于更严格的MVC思想)
package com.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
public class JSPFilter extends OncePerRequestFilter{
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
//这里没有做太严格的过滤,直接重定向主页就行了
response.sendRedirect("/SSM/user/home.do");
}
}
2.web.xml配置过滤器
<!-- 解决.jsp请求过滤器 -->
<filter>
<filter-name>JSPFilter</filter-name>
<filter-class>com.filter.JSPFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>JSPFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!-- 解决非法请求过滤器 -->
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.filter.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
结果:当用户session过期访问页面,会自动跳转到主页,就不会出现后台空指正错误的问题。
当用户试图直接访问.jsp文件的时候,后台直接重定向到主页。(没有太严格的控制这个逻辑,这里可以按照自己的思想去code)