拦截非登录操作,保存请求

看到好多网站都有这么一个功能,就是没登陆的时候,有些页面是可以查看的,但是必须要登陆才能进行操作,很多朋友在开发过程中为防止这样的事情发生也许会做一个提示框,或直接将用户界面重定向到登陆界面,其实这两种的用户用户体验效果都不是很好,其实,用户想操作,我们需要用户登陆,这是没问题的,问题就是我们在处理完用户登陆后,能继续让用户之前的操作流转下去呢,这种实现方式我感觉更好,当然很多网站也都这么实现的,下面我们来简单实现以下。

 

1、首先一个过滤器,对非法的操作进行拦截,同时保存当前的请求。

package com.lyl.servlet;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class LoginFilter implements Filter {

	private String [] urls;

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
			
		 HttpServletRequest req=(HttpServletRequest)request;
		 String url=req.getRequestURI();
		
		 System.out.println("url==="+url);
		 System.out.println("contextPath=="+ req.getContextPath());
		 url=url.replace(req.getContextPath()+"/", "");
		
		  List<String> urlList= Arrays.asList(urls);
		 if(!urlList.contains(url)){
			Object o=req.getSession().getAttribute("user");
			if(o !=null){
				chain.doFilter(request, response);
			}else{
				if(req.getQueryString() !=null) url=url+"?"+req.getQueryString();
				req.setAttribute("reqURL",url);
				req.getRequestDispatcher("/login.jsp").forward(request, response);
			}
		 }else{
			 chain.doFilter(request, response);
		 } 
		
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("--------------------Filter进行了初始化------------------");
		String urlStr=config.getInitParameter("noInterruptUrl");
		urls=urlStr.split(",");
	}

	@Override
	public void destroy() {
		System.out.println("--------------------Filter进行了销毁------------------");
	}

}

 2、登陆成功方法后续处理:如果之前的请求路径不为空,转发到之前的页面。

package com.lyl.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 4488742375496278371L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
			this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
			String userName=req.getParameter("userName");
			String password=req.getParameter("password");
			User user=new User();
			user.setUserName(userName);
			user.setPassword(password);
			String reqURL=req.getParameter("reqURL");
			req.getSession().setAttribute("user", user);
			String dispatcher="bidding.jsp";
			
			//如果登录页面保存之前的请求路径不为空,取出之前的请求路径,转发到之前的请求页面
			if(reqURL !=null && !"".equals(reqURL)){
				dispatcher=reqURL;
			}
			req.getRequestDispatcher("/"+dispatcher).forward(req, resp);
	}

}

 3、web.xml中配置需要不需要拦截的路径,过滤器初始化操作的时候,进行取值。

 

<filter>
  	<filter-name>loginFilter</filter-name>
  	<filter-class>com.lyl.servlet.LoginFilter</filter-class>
  	<init-param>
  		<param-name>noInterruptUrl</param-name>
  		<param-value>login.jsp,login.do,bidding.jsp</param-value>
  	</init-param>
  </filter>

 

 说白了其实原理很简单,进行非登录拦截的时候,顺便存下之前的请求路径,在后面登陆成功后,转发到之前是请求路径就ok了,有兴趣的朋友可以试下,附上源代码。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值