java web开发中的Thread.currentThread()啥情况下会改变啊?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java web开发中的Thread.currentThread()啥情况下会改变啊?相关的知识,希望对你有一定的参考价值。
用struts2、spring、mybatis开发了一个web应用
其中用到了ThreadLocal发现经常会获取不到值
就在登录的时候将Thread.currentThread()值放到session中观察,发现在应用了里面点一会儿Thread.currentThread()就会变掉,变成一个新的线程了。哪位大虾知道原因的啊 指点指点啊。我spring中struts的action范围定义的session
你下一次请求(随便点个超链接都算一次请求,这个你应该清楚吧?)tomcat服务器的时候,服务器到底用哪个线程来处理你的请求你都不知,怎么可以把登录信息放进去呢?
也就是说登录的时候处理你的请求的是某个线程,你做另外操作的时候,很可能又是另外一个服务器线程来处理的。所以登录信息基本上所有系统都是放在session的,别说有的地方取不到session,web程序我还真没发现有地方取不到。比如你说的servlet,我记的不管doPost,doGet,还是service方法都有request参数,request.getSession()不就获取到了吗。
如果真有方法,不让传参数还取不到request对象,你找个能取到的类,弄个类的staic域把request对象或者session对象塞进去。
持有对象时程序员的基本功,也是最重要的技术,如果你还有哪些地方取不到对象,就该反省下了,呵呵……追问
感谢你热心的回答,但是你说没遇见过取不到request的地方,只能说明两点:一你一直在用框架 二你没用servlet做过整体结构设计 你可以看下threadLoacl在什么情况下使用
追答不得不说ThreadLocal确实可以存放登陆信息,不过有个大前提,你的web系统只允许一个人登录,其实你只需要明白,一个session并没有绑定由哪一个线程来处理,一个线程也不是只处理某一个session,举个简单例子,你的web应用有1000个用户同时在线,你认为web服务器有可能会建立1000个线程来一对一处理某个回话吗……
我还是坚持web项目真的能在任意地方取到reqeust对象,只需要看你怎么去控制对象的作用域,你必须承认一个对象能在一个地方被访问到,程序员就能让它在任意地方能访问到……
谢谢!再请教下 那如果我要每一个用户登录后至始至终保存一个变量,该如何保存?
session好像不行,有些方法中得不到session。
或者
使用servlet得到像Struts2的ActionContext.getContext().getSession()这样的取session,有这样的方法不?
Servlet你直接实例一个Session(HttpServletSession),然后把用户信息保存在Session.setAttribution(“userinfo”,user)即可。Session是指一个客户端与服务端的连接,如果你在一个网站连续两次登陆,他首先会把第一个用户信息冲掉,然后保存第二个登陆信息,一般一个网站在一台机子上是不允许同时有两个Session同时出现的。另外,用Session保存用户登录也是不安全的,对小型网站没关系,但对于企业级的系统是不用session的。
本回答被提问者采纳 参考技术B servlet是多线程的,当你有多个用户登录时,servlet容器就会把session中的用户弄混2016-7-5 Java : Thread
两种方式:
1.继承Thread 2.实现Runnable
1.
class MyThread extends Thread{ public static int num = 0; @Override public void run() { // TODO Auto-generated method stub while(num<100) { System.out.println(Thread.currentThread().getName() + " -> "+ num++); } } } public class Test { public static void main(String[] args) { MyThread thread01 = new MyThread(); MyThread thread02 = new MyThread(); thread01.start(); thread02.start(); } }
2.
class YourThread implements Runnable { private static int num = 0; @Override public void run() { // TODO Auto-generated method stub while (num < 100) { System.out.println(Thread.currentThread().getName() + " -> " + num++); } } } public class Test { public static void main(String[] args) { Thread thread01 = new Thread(new YourThread(),"t01"); Thread thread02 = new Thread(new YourThread(),"t02"); thread01.start(); thread02.start(); } }
这种同步问题不会每次都出现.
以上是关于java web开发中的Thread.currentThread()啥情况下会改变啊?的主要内容,如果未能解决你的问题,请参考以下文章
java web开发中的Thread.currentThread()啥情况下会改变啊?