【百占百胜】三创比赛-拦截器(Interceptor),过滤器(Filter)分别实现注册登录(非登录状态不能访问其他页面)

大家好,我是被白菜拱的白菜。
技术:SSM框架,拦截器,过滤器
背景:在我们为实现登录或者注册的时候,当我们访问项目的其余页面时是不能要求访问的,有两种实现方式,一是用filter过滤,而是用interceptor拦截

登录页面:
在这里插入图片描述
注册页面:
在这里插入图片描述

Intercepter具体实现:

1.首先在spring-servlet.xml配置拦截器的具体内容
`

如果有多个拦截器满足拦截处理的要求,则依据配置的先后顺序来执行
     -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截所有的请求,这个必须写在前面,也就是写在【不拦截】的上面 -->
            <mvc:mapping path="/**" />
            <!-- 但是排除下面这些,也就是不拦截请求 -->
            <mvc:exclude-mapping path="/login.jsp" />
            <mvc:exclude-mapping path="/users/login.do" />
            <mvc:exclude-mapping path="/users/register.do" />
            <bean class="com.bzbs.interceptor.LoginInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

2.创建类实现HandlerInterceptor接口
在postHandle()方法中写具体的业务需求,页面被拦截的之后需要做什么

public class LoginInterceptor implements HandlerInterceptor{

	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
		//获取session 判断里面是否存有用户信心,没有则返回登录页面
		HttpSession session=request.getSession();
		Object user =session.getAttribute("user");
		Object password =session.getAttribute("password");
		if(user==null || password==null){
			String url = request.getRequestURL().toString();
			response.sendRedirect(request.getContextPath()+"/system/login.jsp?returnURL="+url);
			return false;
		}
		return true;
	}

}

我这里是判断是否登录,假如已经登录了,就可以直接访问被拦截的页面,session里面没有值则继续放回等会页面,后面拼接原先要访问的地址,登录过后可以直接访问,使得我们访问页面方便了许多。


下面是filter实现:

1.配置web.xml内容

<filter>
		<filter-name>loginFilter</filter-name>
		<filter-class>com.bzbs.filter.LoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>loginFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>

url-pattern为要过滤的页面,/*代表所有页面都要拦截,此处可以配置白名单与黑名单,具体怎么操作这里不再叙述
2.创建类实现Filter接口

/**  
* @ClassName: LoginFilter  
* @Description: 用拦截器没有作用,改变思路,用过滤器实现登录验证,假如没有登录则返回登录页面
* @author Lily  
* @date 2020年3月11日    
*/
public class LoginFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
			throws IOException, ServletException {
		//首先获取http对象
		HttpServletRequest request=(HttpServletRequest)req;
		HttpServletResponse response=(HttpServletResponse)res;
		//此处判断,先获得请求路径,然后对请求路径进行分析

		/*
		 * 
		 * request.getRequestURL() 返回全路径
			request.getRequestURI() 返回除去host(域名或者ip)部分的路径
			request.getContextPath() 返回工程名部分,如果工程映射为/,此处返回则为空
			request.getServletPath() 返回除去host和工程名部分的路径
		 */
		
		String uri=request.getRequestURI();
		/*首先对于登录页面我们是可以直接进行访问的,假如没有登录,则判断是否已经登录,即session
		是否有值,没有值则不允许访问
		*/
		if(!uri.endsWith("register.do")&&!uri.endsWith("login.jsp")&&!uri.endsWith("login.do")&&
				!uri.endsWith(request.getContextPath()) && !uri.endsWith(request.getContextPath() + "/")){
			//下一步想要访问非登录页面,则判断session是否有值
			Object loginUser=request.getSession().getAttribute("user");
			if(loginUser!=null){
				//让他访问
				chain.doFilter(req, res);
			}else{
				//不满足条件,则返回登录页面
				String url = request.getRequestURL().toString();
				response.sendRedirect(request.getContextPath() + "/system/login.jsp?returnURL=" + url);
			}
		}else{
			chain.doFilter(req, res);
		}
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

chain.doFilter就是代表请求通过,这里我为了图方便没有配置白名单,直接用了if判断。

发布了24 篇原创文章 · 获赞 4 · 访问量 2038

猜你喜欢

转载自blog.csdn.net/weixin_44226263/article/details/105243471