JavaEE中Filter实现用户登录拦截
实现思路是编写过滤器,如果用户登录之后session中会存一个user。如果未登录就为null,就可以通过过滤器将用户重定向到登陆页面,让用户进行登陆,当然过滤器得判断用户访问的如果是登陆请求需要放行,如果不是就需要进行拦截并进行验证。登陆成功再session存存入user,这样过滤器每次都会通过。
1.首先编写验证登陆的过滤器
package danger.filter; import java.io.IOException; 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;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import danger.bean.sys.User; /**
* Servlet Filter implementation class LoginFilter
*/
public class LoginFilter implements Filter { /**
* Default constructor.
*/
public LoginFilter() {
// TODO Auto-generated constructor stub
} /**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
} /**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI();
System.out.println("reqURL----------" + path);
// 如果包含login.jsp证明是登陆就放行
if (path.contains("login") || path.contains("/js/") || path.contains("/image/") || path.contains("/css/")
|| path.contains("message.jsp")|| path.contains("404.jsp")|| path.contains("/images/")) {
chain.doFilter(request, response); // 放行
return;
}
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
User user = (User) session.getAttribute("user");
// 如果session中存在user证明用户登录,可以放行。否则认为未登陆重定向到login.jsp
if (user == null) {
res.sendRedirect(req.getContextPath() + "/login/login.jsp");
} else {
System.out.println("user----------"+user);
chain.doFilter(request, response);
} } /**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
} }
if (path.contains("login") || path.contains("/js/") || path.contains("/image/") || path.contains("/css/") || path.contains("message.jsp")|| path.contains("404.jsp")|| path.contains("/images/")) { chain.doFilter(request, response); // 放行 return; } 相当于是对登陆请求以及一些静态资源放行。(可以将一些静态资源放到统一的文件夹下面)
2.web.xml进行配置
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>danger.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.进行测试:
项目名字为danger。再浏览器访问:http://localhost/danger/
控制台打印:
reqURL----------/danger/login/login.jsp
reqURL----------/danger/js/jquery-1.11.js
reqURL----------/danger/controls/login/js/gVerify.js
reqURL----------/danger/controls/login/css/login2.css
reqURL----------/danger/controls/login/js/login.js
reqURL----------/danger/image/logo.png
reqURL----------/danger/controls/login/images/1.jpg
页面被送到登陆界面。
aaarticlea/png;base64,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" alt="" />
4.对登陆的处理:(判断用户名与密码,并在session中添加user属性)
登陆表单(用户名与密码的name与Action的属性名字一样)
<form action="<%=path %>/login.action" name="loginform" accept-charset="utf-8" id="login_form" class="loginForm"
method="post"><input type="hidden" name="did" value="0"/>
<input type="hidden" name="to" value="log"/>
<div class="uinArea" id="uinArea">
<label class="input-tips" for="u">帐 号:</label>
<div class="inputOuter" id="uArea">
<input type="text" id="u" name="username" class="inputstyle"/>
</div>
</div>
<!--密码-->
<div class="pwdArea" id="pwdArea">
<label class="input-tips" for="p">密 码:</label>
<div class="inputOuter" id="pArea">
<input type="password" id="p" name="password" class="inputstyle"/>
</div>
</div>
<!--验证码-->
<div class="yzmArea" id="verifyArea">
<label class="input-tips" for="code_input">验证码:</label>
<div class="inputOuter" id="yArea">
<input type="text" id="code_input" name="y" class="inputstyle"/>
<div id="v_container"></div>
</div>
</div>
<!--登录按钮--> <div id="loginbuttondiv" class="inputOuter">
<input type="submit" value="登 录" class="button_blue" id="my_button"/>
</div>
</form>
处理登陆的action
静态模拟两个用户,并未用户分配不同的权限。(2代表是超级用户,可以进行系统管理)
package danger.action.queryView; /**
* 登陆Action
*/
import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionSupport; import danger.bean.sys.User;
import danger.utils.ValidateCheck; @Controller
@Scope("prototype")
public class LoginAction extends ActionSupport {
private Map<String, Object> result;
private String username;
private String password;
private User user; @Override
public String execute() throws Exception {
result = new HashMap();
// 获取session
HttpSession session = ServletActionContext.getRequest().getSession();
// 用户名与密码不为空进行登陆验证
if (ValidateCheck.isNotNull(username) && ValidateCheck.isNotNull(password)) {
// 模拟登陆成功后session中添加user
if ("root".equals(username) && "123456".equals(password)) {
user = new User();
user.setUsername(username);
user.setRole(2);
session.setAttribute("user", user);
return SUCCESS;
}
if ("信息录入人员".equals(username) && "123456".equals(password)) {
user = new User();
user.setRole(1);
user.setUsername(username);
session.setAttribute("user", user);
return SUCCESS;
}
}
// 来到这里证明登陆未成功
result.put("msg", "账户或者密码错误");
return ERROR;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public Map getResult() {
return result;
} public void setResult(Map result) {
this.result = result;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
}
struts.xml 配置(登陆成功后进入主页,失败后到message.jsp显示错误信息)
<!-- 登陆 -->
<action name="login" class="loginAction">
<result name="success" type="redirect">/index.jsp</result>
<result name="error">/message.jsp</result>
</action>
5.退出系统的处理(删除session中的user,并将用户重定向到一个页面)
处理退出的Action(清除session)
package danger.action.queryView; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionSupport;
@Controller
@Scope("prototype")
public class LogoutAction extends ActionSupport { @Override
public String execute() throws Exception {
// 获取session
HttpSession session = ServletActionContext.getRequest().getSession();
// 清空session中的用户
session.removeAttribute("user");
return super.execute();
}
}
struts.xml配置Action
<!-- 退出 -->
<action name="logout" class="logoutAction">
<!-- 成功后送到登陆页面 -->
<result name="success" type="redirect">/login/login.jsp</result>
</action>
退出系统按钮
<a href=javascript:void(0)
style="text-decoration: none; color: white;" onclick="logout()"><span>退出系统</span></a>
处理退出系统的JS函数
<script type="text/javascript">
function logout() {
if (confirm("确定退出系统?")) {
window.location.href = "${baseurl}/logout.action"
}
}
</script>
JavaEE中Filter实现用户登录拦截的更多相关文章
- 过滤器(filter)实现用户登录拦截
过滤器(filter)实现用户登录拦截 >>>>>>>>>>>>>>>>>>>> ...
- 用户登录拦截器查询到登录用户后如何将用户信息传递到后面的Controller
taotao创建订单代码中之前忘了加入用户信息,那么加上呢? 分析:用户创建订单的时候,我们会强制要求用户先登录,也就是说,创建订单的Controller执行时,一定是用户已经登录了的,而用户只要登录 ...
- 在Ubuntu中增加root用户登录
一:增加root用户登录 1.打开终端,输入:sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 2.在弹出的编辑框里输入:gree ...
- spring boot 使用拦截器 实现 用户登录拦截
登录拦截和和权限拦截实现类似 首先自定义一个[DefineAdapter]类,这个类我是用来放自定义的配置(比如 自定义请求参数,自定义拦截器等),集成WebMvcConfigurerAdapte ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-10.Springboot2.x用户登录拦截器开发实战
笔记 10.Springboot2.x用户登录拦截器开发实战 简介:实战开发用户登录拦截器拦截器 LoginInterceptor 1.实现接口 LoginI ...
- SpringMVC拦截器实现用户登录拦截
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 1 < ...
- Oracle 12c中新建pdb用户登录问题分析
Oracle 12c新建用户登录问题分析1 用sys用户新建用户,提示公用用户名或角色名无效.原因:Oracle 12c中,在容器中建用户(或者应该称为使用者),须在用户名前加c##.默认登录连接的就 ...
- net mvc中实现记录用户登录信息(记住登录效果)
现记录用户登录信息(记住登录效果) 本文讲述了使用cookies实现网站记住登录效果,效果如下: 主要实现方法,当用户选择记住登录时建立cookies保存用户名和用户密码,当用户登录不选择记住登录时, ...
- JavaWeb 之 Filter 验证用户登录案例
需求: 1. 访问一个网站的资源.验证其是否登录 2. 如果登录了,则直接放行. 3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录". 代码实现: import j ...
随机推荐
- C语言进阶——const 和 volatile 分析09
const只读变量: const修饰的变量是只读的,本质还是一个变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局函数区分配资源空间 const只在编译器有用,在运行期无用 ...
- 猴子吃桃问题 python
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只剩下一个桃子了.求第 ...
- 邮件系统之Postfix与Dovecot
电子邮件系统 电子邮件系统基于邮件协议来完成电子邮件的传输,常见的邮件协议有: 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转发出的电子邮件, ...
- 挂个AC自动机
struct ACM{ ],f[N],cnt[N]; int sz,rt; int ins(char *s){ int n=strlen(s),u=rt; ;i<n;i++){ int c=s[ ...
- 一步一步学Linq to sql(一):预备知识
什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集成查询)的一部分,全称基于关系数据的 .NET 语言集成查询,用于以对象形式管理关系数据,并提供了丰富 ...
- android 管理Touch事件
The onInterceptTouchEvent() method gives a parent the chance to see any touch event before its child ...
- 《Cracking the Coding Interview》——第12章:测试——题目3
2014-04-24 23:28 题目:玩象棋游戏,你要设计一个bool型的方法来检测一个棋子能否移动到指定位置. 解法:不同的棋子有不同的移动规则,那么应该采取棋子基类实现接口,各个棋子子类来实现的 ...
- 浅谈==和equals的区别
java中的==和equals的区别? 看上面的代码,输出的结果是: true false true true 1.为什么会有上面的区别呢?==和equals比较的到底是什么呢? 搞清楚两者的区别其实 ...
- pytorch下对简单的数据进行分类(classification)
看了Movan大佬的文字教程让我对pytorch的基本使用有了一定的了解,下面简单介绍一下二分类用pytorch的基本实现! 希望详细的注释能够对像我一样刚入门的新手来说有点帮助! import to ...
- Spring 笔记(三)Bean 装配
前言 Spring 有两大核心,也就分成两份笔记分别记录. 其一是管理应用中对象之间的协作关系,实现方式是依赖注入(DI),注入依赖的过程也被称为装配(Wiring). 基于 JavaConfig 的 ...