您的位置:首页 > 编程语言 > Java开发

struts2结合过滤器和cookie实现自动登录

2014-04-06 19:40 543 查看
文章出处: /article/8200186.html
写个过滤器要对登录页面进行过滤,如果session为空,则去cookie中去寻找相关的信息,如果找到了则加载用户的信息,然后转发到登录成功的页面。我用的是struts2实现的,cookie存放用户名和Md5加密后的密码,贴代码:
1.登录页面index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>

<html>

<body>

<form name="form" id="form1" action="user_login.action" method="post">

用户名:

<input name="user.username" id="username" />

<br />

密码:

<input type="password" name="user.password" id="password" />

<br />

<input type="checkbox" name="autologin" value="on">

两周内自动登录

<div>

<font><font color="red"></font>${message}</font>

</div>

<br>

<input type="submit" value="登录" />

</form>

</body>

</html>

2.登录成功页面welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>

<html>

</head>

<body>

登录成功!${user.username}

</body>

</html>

3.User.java

package bean;

public class User {

private int id;

private String username;

private String password;

public User() {

}

public void setPassword(String password) {

this.password = password;

}

public String getPassword() {

return password;

}

public void setUsername(String username) {

this.username = username;

}

public String getUsername() {

return username;

}

public void setId(int id) {

this.id = id;

}

public int getId() {

return id;

}

}

4.UserAction.java

package action;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;

import org.apache.struts2.interceptor.ServletResponseAware;

import util.DBUtil;

import util.UtilCommon;

import bean.User;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport implements ServletRequestAware,

ServletResponseAware {

private User user;

private String autologin;

private HttpServletRequest request;

private HttpServletResponse response;

private HttpSession session;

private String message;

public String login() {

Cookie username, password;

session = request.getSession();

user.setPassword(UtilCommon.md5Encryption(user.getPassword()));//MD5加密

user=DBUtil.checkLogin(user);

if (user != null) {

if ("on".equals(autologin)){

// 如果用户选择了“两周内自动登录”,则向用户发送两个cookie, 一个cookie记录用户名,另一个记录密码

username = new Cookie("username", user.getUsername());

username.setMaxAge(60 * 60 * 24 * 14); // 设置Cookie有效期为14天

username.setPath("/");

response.addCookie(username);

password = new Cookie("password", user.getPassword());

password.setMaxAge(60 * 60 * 24 * 14);

password.setPath("/");

response.addCookie(password);

}

session.setAttribute("user", user);

} else {

message = "用户名或密码错误!";

return "input";

}

return "success";

}

public void setServletRequest(HttpServletRequest request) {

this.request = request;

}

public void setServletResponse(HttpServletResponse response) {

this.response = response;

}

public String getAutologin() {

return autologin;

}

public void setAutologin(String autologin) {

this.autologin = autologin;

}

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

public void setMessage(String message) {

this.message = message;

}

public String getMessage() {

return message;

}

}

5.过滤器LoginFilter.java

package 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.Cookie;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import util.DBUtil;

import bean.User;

public class LoginFilter implements Filter {

public void destroy() {

}

public void doFilter(ServletRequest req, ServletResponse res,

FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = ((HttpServletResponse) res);

HttpSession session = request.getSession(true);

String username, password;

Cookie[] cookies;

User user = (User) session.getAttribute("user");

if (user == null) {

cookies = request.getCookies();

if (cookies != null && cookies.length > 0) {

username = getCookieValue(cookies, "username");

password = getCookieValue(cookies, "password");

if (username != null && password != null) {

user=new User();

user.setUsername(username);

user.setPassword(password);

user = DBUtil.checkLogin(user);// 加载用户信息

session.setAttribute("user", user); // user添加到session中。

request.getRequestDispatcher("/welcome.jsp").forward(request,

response);

} else {

request.getRequestDispatcher("/login.jsp").forward(request,

response);

}

} else {

request.getRequestDispatcher("/login.jsp").forward(request,

response);

}

}

chain.doFilter(req, res);

}

public void init(FilterConfig arg0) throws ServletException {

}

public String getCookieValue(Cookie[] cookies, String str) {

String result = null;

for (Cookie cookie : cookies) {

if (cookie.getName().equals(str)) {

result = cookie.getValue();

break;

}

}

return result;

}

}

6.数据库操作DBUtil.java

package util;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import bean.User;

public class DBUtil {

//取得数据库连接

public static Connection getConnection() {

Connection conn = null;

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("驱动程序没有找到" + e.getMessage());

}

try {

conn = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/cookie", "root", "123");

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("获得连接出错!");

}

return conn;

}

public static User checkLogin(User user){

Connection con=null;

PreparedStatement ps=null;

ResultSet rs=null;

String sql="select * from users where username=? and password=?";

try{

con=getConnection();

ps=con.prepareStatement(sql);

ps.setString(1, user.getUsername());

ps.setString(2, user.getPassword());

rs=ps.executeQuery();

if(rs.next()){

user.setId(rs.getInt("id"));

user.setUsername(rs.getString("username"));

user.setPassword(rs.getString("password"));

return user;

}

rs.close();

ps.close();

con.close();

}catch(Exception e){

e.printStackTrace();

}

return null;

}

}

7.md5加密方法类UtilCommon.java

package util;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class UtilCommon {

public static String md5Encryption(String plainText) {

StringBuffer buf = new StringBuffer("");

try {

MessageDigest md = MessageDigest.getInstance("MD5");

md.update(plainText.getBytes());

byte b[] = md.digest();

int i;

for (int offset = 0; offset < b.length; offset++) {

i = b[offset];

if (i < 0)

i += 256;

if (i < 16)

buf.append("0");

buf.append(Integer.toHexString(i));

}

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//return buf.toString());// 32位的加密

return buf.toString().substring(8, 24);// 16位的加密

}

public static void main(String agrs[]) {

System.out.println(md5Encryption("123456"));

}

}

8.web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>

<welcome-file>login.jsp</welcome-file>

</welcome-file-list>

<filter>

<!-- 定义核心Filter的名字 -->

<filter-name>LoginFilter</filter-name>

<!-- 定义核心Filter的实现类 -->

<filter-class>

filter.LoginFilter

</filter-class>

</filter>

<filter-mapping>

<filter-name>LoginFilter</filter-name>

<url-pattern>*.jsp</url-pattern>

</filter-mapping>

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<filter>

<filter-name>struts-cleanup</filter-name>

<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>

</filter>

<filter-mapping>

<filter-name>struts-cleanup</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

</web-app>

9.struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<constant name="struts.i18n.reload" value="true" />

<constant name="struts.devMode" value="false" />

<constant name="struts.configuration.xml.reload" value="true" />

<package name="default" extends="struts-default" namespace="/">

<action name="user_*" class="action.UserAction" method="{1}">

<result name="success">/welcome.jsp</result>

<result name="input">/login.jsp</result>

</action>

</package>

</struts>

10.数据库脚本

/*

SQLyog 企业版 - MySQL GUI v8.14

MySQL - 5.6.2-m5 : Database - cookie

*********************************************************************

*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

CREATE DATABASE /*!32312 IF NOT EXISTS*/`cookie` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `cookie`;

/*Table structure for table `users` */

DROP TABLE IF EXISTS `users`;

CREATE TABLE `users` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`username` varchar(50) DEFAULT NULL,

`password` varchar(50) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

/*Data for the table `users` */

insert into `users`(`id`,`username`,`password`) values (1,'zxc','49ba59abbe56e057');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

工程结构图:



struts2的jar包和mysql的驱动自己加,你们懂的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: