使用cookie实现跨域登录

jsp的登录页面login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
    Cookie cookie = new Cookie("auto1","useraccountname"+"#cms#+"+"userpassword");
    cookie.setPath("/");
    cookie.setDomain(".123.gov.cn");
    response.addCookie(cookie);
    %>

<html>
  <head>
    <title>My JSP 'login.jsp' starting page</title>
  </head>
  <body>
   ${msg}
    <form action="${pageContext.request.contextPath }/login" method="post">
       username:<input type="text" name="username"/>
       <br/>
       password:<input type="password" name="password"/>
       <br/>
       <input type="checkbox" name="autologin" value="login"/>是否自动登录
       <br/>
       <input type="submit" value="login"/>
    </form>
  </body>
</html>

登录成功的页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'success.jsp' starting page</title>
  </head>
  <body>
    当前登录用户名: ${user.username }
  </body>
</html>

拦截器

package cn.cc.test;

import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 登录的过滤器
 * @author asus
 *
 */
public class LoginFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
    }
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        //最终实现的目的:
        //www.123.gov.cn登录成功,直接访问success.jsp页面,cmp.123.gov.cn也可以获取到session域里面user对象的属性值
        //判断session里面是否有user对象
        HttpServletRequest req = (HttpServletRequest) request;
        User user = (User) req.getSession().getAttribute("user");
        if(user != null) {
            //放行
            chain.doFilter(request, response);
        } else {//session中没有user对象,从cookie中获取值
            //获取所有的cookie
            Cookie[] cookies = req.getCookies();
            //根据名称获取
            Cookie cookie = findCookie(cookies,"auto");
            //判断
            if(cookie == null) {
                //放行
                chain.doFilter(request, response);
            } else {//cookie中有相同名称的cookie
                //cookie中把值获取出来
                //lucy#cmst#123
                String values = cookie.getValue();
                //切分
                String[] names = values.split("#cms#");
                //获取cookie用户名
                String username = names[0];
                //获取cookie密码
                String password = names[1];

                //把用户名和密码放到session里面
                User u = new User();
                u.setUsername(username);
                u.setPassword(password);
                req.getSession().setAttribute("user", u);
                //放行
                chain.doFilter(request, response);
            }

        }
    }

    //判断是否有相同名称的cookie
    private Cookie findCookie(Cookie[] cookies, String name) {
        if(cookies == null) {
            return null;
        }
        for (Cookie cookie : cookies) {
            //得到cookie的名称
            String cookieName = cookie.getName();
            //判断
            if(cookieName.equals(name)) {
                return cookie;
            }
        }
        return null;
    }
    public void destroy() {
        // TODO Auto-generated method stub

    }

}

登录的servlet

package cn.cc.test;

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 java.io.IOException;
public class LoginServlet extends HttpServlet {
    /**
     * 实现登录的功能
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取表单输入的用户名和密码
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //封装到javabean        if (username .equalsIgnoreCase("admin") && password.equalsIgnoreCase("admin")){
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            //成功
            //判断是否选择复选框
            String checkboxValue = request.getParameter("autologin");
//    System.out.println(checkboxValue);
            //判断复选框值是否是null
            if(checkboxValue != null) { //进行自动登录
                Cookie cookie = new Cookie("auto",username+"#cms#"+password);
                //设置cookie 
                cookie.setPath("/");
        //设置这个域名下都能得到这个cookie
                cookie.setDomain(".123.gov.cn");
                //返回到浏览器中
                response.addCookie(cookie);
            }
            //把返回的user对象放到session里面
            request.getSession().setAttribute("user", user);
            //到成功页面
            response.sendRedirect(request.getContextPath()+"/success.jsp");
            return;
        } else {
            //返回到登录页面,传递错误信息
            request.setAttribute("msg", "用户名或者密码错误");
            //转发
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
                doGet(request,response);
    }
}

user类

package cn.cc.test;

public class User {

    private String username;
    private String password;
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    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;
    }
 最终的实现效果

151107_lsMM_2685857.png

151223_4Wv9_2685857.png151342_IeLK_2685857.png

开始第一个域名没有显示admin

第二个域名登陆成功了显示admin

第一个域名没登录 但是也能显示admin了

这就说明跨域成功登录了

实现的原理

       其中的一个域名登陆成功后将账号密码保存到cookie里面 让他跨域  ,当其他的域名访问的时候,通过拦截器 实现拦截看用户登录了吗 没登录先去查找cookie  将用户信息放到session里面然后放行 没有这个cookie就返回登录。

151539_iIJp_2685857.jpeg

可以查看cookie也进来了

转载于:https://my.oschina.net/halouha/blog/702720

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
跨域使用cookie是指在不同域名下的网站之间共享cookie信息。根据引用\[2\]中的说明,服务器端设置cookie时,可以通过指定domain属性来实现跨域共享。当设置了domain属性为父域或当前域时,访问该域名及其子域名时都会携带cookie信息,从而实现跨域共享。例如,如果a.com和b.com希望共享cookie,可以在设置cookie时将domain属性设置为".com",这样访问a.com和b.com时都会携带cookie信息。 在使用cookie时,可以通过设置domain属性来实现跨域共享。以vue-cookies为例,可以使用this.$cookies.set方法来设置cookie,其中可以通过指定domain参数来设置cookie的域名。例如,使用this.$cookies.set("userInfo", "userInfo",-1, "/", "baidu.com")来设置cookie的域名为"baidu.com",这样就可以实现a.com和b.com之间的cookie跨域共享。\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [实现cookie跨域共享的两种方式](https://blog.csdn.net/weixin_43002640/article/details/115187101)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [关于cookie跨域](https://blog.csdn.net/jaychou976/article/details/111563523)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值