实现用户自动登陆的过滤器
原理:在用户登陆成功后,以cookis形式发送用户名、密码给客户端
编写一个过滤器,filter方法中检查cookie中是否带有用户名、密码信息,如果存在则调用业务层登陆方法,登陆成功后则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆
package com.jjyy.web;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.jjyy.domain.User;
import com.jjyy.util.DaoUtils;
import com.jjyy.util.MD5Utils;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取用户名密码
String name = request.getParameter("name");
String password = MD5Utils.md5(request.getParameter("password"));
//2.校验用户名密码
String sql = "select * from user where name = ? and password = ? ";
User user = null;
try {
QueryRunner runner = new QueryRunner(DaoUtils.getSource());
user = runner.query(sql, new BeanHandler<User>(User.class),name,password);
} catch (SQLException e) {
e.printStackTrace();
}
if(user == null){
response.getWriter().write("用户名密码不正确");
return;
}else{
//3.登录用户
request.getSession().setAttribute("user", user);
// 如果用户勾选过30天内自动登陆,发送自动登陆cookie
if("true".equals(request.getParameter("autologin"))){
Cookie autologinC = new Cookie("autologin",user.getName()+":"+user.getPassword());
autologinC.setPath(request.getContextPath());
autologinC.setMaxAge(3600*24*30);
response.addCookie(autologinC);
}
//4.重定向到主页
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.jjyy.web;
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 LogoutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if(request.getSession(false)!=null){
request.getSession().invalidate();
}
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.jjyy.domain;
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String name;
private String password;
private String role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
package com.jjyy.filter;
import java.io.IOException;
import java.sql.SQLException;
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.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.registry.infomodel.User;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.jjyy.util.DaoUtils;
/**
* autoLoginFilter
* @author JiangYu
*
*/
public class AutoLoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//1.只有未登录的用户才能自动登陆
if(req.getSession(false)==null || req.getSession().getAttribute("user")==null){
//2.只有带了自动登陆cookie的用户才能自动登陆
Cookie [] cs = req.getCookies();
Cookie findC = null;
if(cs!=null){
for(Cookie c : cs){
if("autologin".equals(c.getName())){
findC = c;
break;
}
}
}
if(findC!=null){
//3.自动登录Cookie中保存的用户名密码都需要是正确的才能自动登陆
String name = findC.getValue().split(":")[0];
String password= findC.getValue().split(":")[1];
String sql = "select * from user where name = ? and password = ? ";
User user = null;
try {
QueryRunner runner = new QueryRunner(DaoUtils.getSource());
user = runner.query(sql, new BeanHandler<User>(User.class),name,password);
} catch (SQLException e) {
e.printStackTrace();
}
if(user!=null){
req.getSession().setAttribute("user", user);
}
}
}
//无论是否自动登陆,都放行资源
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
package com.jjyy.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
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.HttpServletRequestWrapper;
public class EncodeFilter implements Filter {
private FilterConfig config = null;
private String encode = null;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//响应的乱码处理
response.setContentType("text/html;charset=utf-8");
//装饰
chain.doFilter(new MyHttpServletRequest((HttpServletRequest)request), response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
this.encode = config.getInitParameter("encode")==null?"utf-8":config.getInitParameter("encode");
}
//请求乱码的处理
class MyHttpServletRequest extends HttpServletRequestWrapper{
private HttpServletRequest request = null;
boolean isNotEncode = true;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public Map getParameterMap() {
try {
if(request.getMethod().equalsIgnoreCase("POST")){
request.setCharacterEncoding(encode);
return request.getParameterMap();
}else if(request.getMethod().equalsIgnoreCase("GET")){
//request.getParameterMap()第一次会解决,然后缓存起来
//request.getParameterMap()第二次直接从缓存中的map
Map<String,String[]> map = request.getParameterMap();
if(isNotEncode){
for(Map.Entry<String, String[]> entry:map.entrySet()){
String [] vs = entry.getValue();
for(int i=0;i<vs.length;i++){
vs[i]= new String(vs[i].getBytes("iso8859-1"),encode);
}
}
isNotEncode = false;
}
return map;
}else{
return request.getParameterMap();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return super.getParameterMap();
}
@Override
public String getParameter(String name) {
return getParameterValues(name)==null?null:getParameterValues(name)[0];
}
@Override
public String[] getParameterValues(String name) {
return (String[])getParameterMap().get(name);
}
}
}
package com.jjyy.util;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
public static String md5(String plainText) {
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("没有md5这个算法!");
}
String md5code = new BigInteger(1, secretBytes).toString(16);
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
}
package com.jjyy.util;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DaoUtils {
private static DataSource source = new ComboPooledDataSource();
private DaoUtils() {
}
public static DataSource getSource(){
return source;
}
public static Connection getConn(){
try {
return source.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
分享到:
相关推荐
Ansible-ansible-filter-plugins.zip,所有ansible过滤器和一些自定义one-sansible过滤器的文档,ansible是一个简单而强大的自动化引擎。它用于帮助配置管理、应用程序部署和任务自动化。
一个简单的 Django 应用程序,使用自动完成小部件在 django admin 中呈现列表过滤器。这个应用程序深受dal-admin-filters 的启发。 概述: Django 预装了一个管理面板,这是一个创建快速 CRUD 的好工具。2.0 版带有...
一个简单的Django应用程序,使用自动完成小部件在django admin中呈现列表过滤器。 这个程序的灵感来自 概述: Django预装了管理面板,这是创建快速CRUD的好工具。 2.0版带有一个非常需要的属性,该属性使用select2...
AngularJS过滤器可自动设置长邮政编码和短邮政编码的格式。 安装 您可以使用安装过滤器: $ bower install angular-zipcode-filter 或 : $ npm install angular-zipcode-filter 然后,您必须将其包含在HTML中:...
一个简单的 Django 应用程序,可通过租户 ID 自动过滤所有模型的查询集。 所有模型都需要定义一个指向租户模型的外键字段并使用租户过滤器管理器。 强制设置: TENANT_FILTER = { 'TENANT_FK_NAME': 'tenant', ...
每个活动警报主题的使用者都可以始终创建自己的本地过滤器,但是alarms-filter应用程序为所有使用者提供了一组共享的已过滤主题的全局集合。 快速撰写 抢项目 git clone ...
Steam Web Filter Bypasser是Google Chrome的扩展程序,可为Steam的Web过滤器页面提供自动旁路功能,以及其他一些有用的功能。与该类别中的其他扩展程序不同,这是唯一一个智能绕过Steam的所有筛选器页面,但仅通过...
延迟:应用过滤器之前的毫秒 minLength:搜索的最小字符串lentgh initial:仅搜索初始文本(默认值:true) eventKey:事件数字(默认值:'keyup') resetOnBlur:自动重置选择 sourceData:函数生成数据源...
在DEVIANTART.COM域中访问站点的数据此权限用于将过滤器应用于DeviantArt页面,并在偏差缩略图的左上角添加快速隐藏图标。 访问浏览历史记录“历史记录”权限用于从浏览器的历史记录中删除DeviantArt过滤器管理面板/...
如果您更改任何源文件,该应用程序将自动重新加载。 代码脚手架 :magnifying_glass_tilted_left: 运行ng generate component component-name生成一个新的组件。 您还可以使用ng generate directive|pipe|service|...
[myAutoLoginWeb]过滤器Filter学习-实现用户的自动登录与IP黑名单过滤 [myBookStore]单机版的书店管理系统 [myDbPoolUse]C3P0连接池配置/DBCP连接池配置/Apache的DBUtils框架使用 [myFilterDemoWeb]过滤器Filter...
[myAutoLoginWeb]过滤器Filter学习-实现用户的自动登录与IP黑名单过滤 [myBookStore]单机版的书店管理系统 [myDbPoolUse]C3P0连接池配置/DBCP连接池配置/Apache的DBUtils框架使用 [myFilterDemoWeb]过滤器Filter学习...
垃圾邮件过滤器插入工具允许您自动添加多个垃圾邮件过滤器并将其链接到用户现有的 Google Analytics 配置文件。 该工具使用 Bootstrap 和 Google Analytics JavaScript API 构建。 因为它是 JS API,所以它是函数式...
DMS过滤器套件 该软件包使DMS / Filter可在您的应用程序中用于输入过滤。 当前状态: 安装 1.导入库 选项A)使用Composer。 composer require dms/dms-filter-bundle 2.启用捆绑 将此添加到您的AppKernel.php new...
模拟mvc过滤器注册这是一个测试项目,旨在强调正常的Spring Boot应用程序启动与使用@... 在应用程序启动时,这导致将过滤器添加到过滤器链中。 在较低的顺序中,第二次加法在AbstractFilterRegistrationBean
一个小巧但功能不凡的Web应用漏洞扫描器,能够对整个网站进行漏洞扫描,并能够对发现的漏洞(SQL注入,跨站脚本)进行验证;它也可以单独进行漏洞验证。 运行平台:Windows with .Net FrameWork 2.0或以上。 界面...
主要有快速绑定模型到数据库,快速验证,过滤器Filter等代码。 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心...
17Filter过滤器 18断点应用 19弱网测试 20 20-Fiddler系列课--设置Fiddler捕获HTTPS流量 21-Fiddler系列课-设置Fiddler捕获Firefox HTTPS流量 22-Fiddler系列课--Android APP抓包详解 23-iOS APP抓包详解 24-Willow....
针对Ionic Framework(iOS / Android)的特定于平台的搜索过滤器插件 目录 演示版 观看下面的演示视频 使用appId: ab56e8bd在上下载演示应用程序 注意:在Ionic View应用程序上,不遵守...
自动实体 自动使用满足特定条件的实体填充lovelace卡。 有关安装说明,。 用法 type : custom:auto-entities card : entities : - ... entities:在应用任何过滤器之前,将在此处添加的所有实体添