`
星夜的遐想
  • 浏览: 183594 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 
阅读更多

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

 

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了,有兴趣的朋友可以试下,附上源代码。

 

分享到:
评论

相关推荐

    YCAndroidTool:用于项目测试,崩溃重启操作,崩溃记录日志【可以查看,分享】和重启【多种重启app方式】;网络拦截查看的工具小助手,拦截请求和响应数据,统计接口请求次数,流量消耗,以及统计网络链接dns解析请求请求响应等时间。提高开发效率……

    该库具有的功能崩溃处理相关模块:崩溃重启操作,崩溃记录日志操作,崩溃日志列表支持查询,删除,查看详情,分享,保存文本,以及截图等操作。网络分析库模块:网络流程分析,记录每个网络请求-&gt;响应数据,方便查看...

    axios-curlirize:axios插件将请求转换为cURL命令,保存并记录它们

    该模块利用axios的拦截器将请求记录为cURL命令。 还将其存储在响应的config对象中。 因此,可以在应用程序的控制台以及响应的res.config.curlCommand属性中看到该命令。 更换记录仪 默认情况下,axios-curlirize使用...

    Python抓包程序mitmproxy安装和使用过程图解

    一、介绍说明 mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似...1、拦截HTTP和HTTPS请求和响应 2、保存HTTP会话并进行分析 3、模拟客户端发起请求,模拟服务器端返回响应 4、利用反向代理将流量转发给指定的服务器

    WProxydlfwq代理工具

    Proxyman专为开发人员和网络爱好者设计,它允许用户拦截、查看和修改所有传入和传出的网络请求,并提供详细的分析和调试功能。 Proxyman支持HTTP、HTTPS和WebSocket协议,因此,可以轻松捕获和查看这些协议下的网络...

    阶段二模块三作业(模块编程题)

    模块编程题 ...使用过滤器对添加用户的请求进行拦截,判断是否是未登录状态 未登录:跳转到登陆页面 已登陆:放行到目标资源,完成添加操作 提示:用户登陆时,将用户信息存到session中,过滤器

    Java_WebMvc_Student.zip

    使用过滤器对添加用户的请求进行拦截,判断是否是未登录状态 未登录:跳转到登陆页面 已登陆:放行到目标资源,完成添加操作 提示:用户登陆时,将用户信息存到session中,过滤器中判断session中有没有用户...

    自己实现的spring-session

    使用filter拦截用户的请求,在filter中包装request,在request的包装类requestWrapper中,重写getSession(), 和getSession(boolean create)。自己实现httpSession,在getSession中获取cookie,从cookie中读取...

    使用Ajax时处理用户session失效问题的解决方法

    在使用spingMVC的拦截器来处理用户session失效的问题时,当用户session失效会返回一串javascript字符串强制用户浏览器跳转至登录页面。然而当使用Ajax请求数据时,在验证失败后只会响应一串字符串,JavaScript并不会...

    【毕业设计】基于springboot的仿共享单车后台源码及笔记【源码+SQL脚本】.zip

    springSecurity(权限验证和请求拦截) AES对称加密数据,RSA非对称加密公钥key(对用户信息进行加密) redis缓存token(token作为用户的标识,维护用户的状态,类似于session) redis结合ActiveMQ发送短信验证码和防止...

    Asp.Net中MVC缓存详解

    当 web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝。 Web应用缓存技术大体上可以分为两类:服务端缓存和客户端缓存。两种目标都是减少重复性内容的生成和网络传输工作,因为缓存数据存储的位置...

    python代理工具mitmproxy使用指南

    mitmproxy 是 man-in-the-middle proxy 的简称,译为中间人代理工具,可以用来拦截、修改、保存 HTTP/HTTPS 请求。以命令行终端形式呈现,操作上类似于Vim,同时提供了 mitmweb 插件,是类似于 Chrome 浏览器开发者...

    node.js 中间件express-session使用详解

    当客户访问其他页面时,可以判断客户的登录状态,做出提示,相当于登录拦截。 session可以和Redis或者数据库等结合做持久化操作,当服务器挂掉时也不会导致某些客户信息(购物车)丢失。 二、session的工作流程...

    autohttptests:Laravel http测试生成器。 不再需要手工进行笔试

    该命令将拦截您的请求,并将响应转换为测试。 完成后,您的测试将保存在测试/功能/ 视频演示 它测试什么? 请求充当同一用户 使用带有相同参数的相同动词(GET,PUT,POST)发出请求 断言http响应代码 断言错误 ...

    happybike:仿共享单车后台原始码和笔记-后台

    springSecurity(权限验证和请求拦截) AES对称加密数据,RSA非对称加密公钥密钥(对用户信息进行加密) redis缓存令牌(令牌作为用户的标识,维护用户的状态,会话) redis结合ActiveMQ发送短信验证码和防止...

    JFast开发手册1

    本平台提供精确到操作的简化实现,提出“行为”的概念,即将需要控制的操作URL作为“行为”进行统一管理,后台在监听到有相关请求进,对用户权限进行判定,看是否有对应的权限分配;为方便操作,目前将“行为”绑定...

    vc++ 应用源码包_1

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

    vc++ 应用源码包_2

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

    乐优商城.xmind

    添加映射路径,我们拦截一切请求 返回新的CorsFilter 提交方式 GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源 BUG 分类不能打开,当添加后却能打开。 修改一天的BUG 最后发现...

    vc++ 应用源码包_6

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

Global site tag (gtag.js) - Google Analytics