能不能给我发一个发给我一份Subject: EX...

ThinkPHP实现支付宝接口功能 - ThinkPHP框架
最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能。这里我用的是即时到帐的接口,具体实现的步骤如下:一、下载支付宝接口包
下载地址:
具体如何下载,我就不在罗嗦了~~
很多人反映,用支付宝的接口到最后面会出现验证错误。其实,这里需要对接口程序进行一下改造。需要添加几个自定义函数。为了让大家以后避免出现同样的问题,我把我改造好的支付宝接口程序上传了()。大家可以下载下来,解压后放到框架的Vendor目录中即可~
二、重新整理接口包文件,这一步应该算是比较关键的(个人认为)
下载下来的接口包文件有很多语言的源码,
我们选择 create_direct_pay_by_user-PHP-UTF-8 这个名称的接口文件。里面包括如下文件:
images文件里是支付宝相关的一些标志的图片,我们暂不管他,lib文件很重要,是整个接口的核心类文件;
alipay.config.php是相关参数的配置文件
alipayapi.php
是支付宝接口入口文件
notify_url.php 是服务器异步通知页面文件;
return_url.php 是页面跳转同步通知文件;
在ThinkPHP的框架文件下,找到Extend 进入,再进入Vendor,在Vendor文件夹下,新建文件夹Alipay,把支付宝作为第三方类库引入。然后,复制支付宝接口文件包中lib文件里的所有文件。一共4个文件,如下:
现在对以上文件进行重命名,
alipay_core.function.php重命名为:Corefunction.
alipay_md5.function.php重命名为:Md5function.php;
alipay_notify.class.php重命名为:Notify.php;
alipay_submit.class.php重命名为:Submit.php;
然后,打开Submit.php文件,把以下代码去掉;require_once(&alipay_core.function.php&);
require_once(&alipay_md5.function.php&);同样,打开Notify.php文件,把以下两段代码去掉require_once(&alipay_core.function.php&);
require_once(&alipay_md5.function.php&);为什么要去掉以上两个文件中的这两段代码,因为在项目中调用接口文件的时候,我把所有4个核心文件都通过vendor来进行引入。所以,这不再需要导入。
到此,支付宝接口包相关核心类库的整理基本完成。现在开始在项目中调用;
三、在项目中调用支付宝接口
调用分两步:
1、在配置文件中Conf/Config.php文件中对支付宝相关参数进行配置://支付宝配置参数
'alipay_config'=&array(
&&&&&&&'partner'&=&'20********50',&&&//这里是你在成功申请支付宝接口后获取到的PID;
&&&&'key'=&'9t***********ie',//这里是你在成功申请支付宝接口后获取到的Key
&&&&'sign_type'=&strtoupper('MD5'),
&&&&'input_charset'=&&strtolower('utf-8'),
&&&&'cacert'=&&getcwd().'\\cacert.pem',
&&&&'transport'=&&'http',
&&&&&//以上配置项,是从接口包中alipay.config.php&文件中复制过来,进行配置;
'alipay'&&&=&array(
&//这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
'seller_email'=&'',
//这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
'notify_url'=&'/Pay/notifyurl',&
//这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
'return_url'=&'/Pay/returnurl',
//支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
'successpage'=&'User/myorder?ordtype=payed',&&&
//支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
'errorpage'=&'User/myorder?ordtype=unpay',&
),2、新建一个PayAction控制器代码如下:&?php
class&PayAction&extends&Action{
&&&&&&&//在类初始化方法中,引入相关类库&&&&
&&&&&&&public&function&_initialize()&{
&&&&&&&&vendor('Alipay.Corefunction');
&&&&&&&&vendor('Alipay.Md5function');
&&&&&&&&vendor('Alipay.Notify');
&&&&&&&&vendor('Alipay.Submit');&&&&
&&&&//doalipay方法
&&&&&&&&/*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
&&&&&&&&&&然后进行相关处理
&&&&&&&&*/
&&&&public&function&doalipay(){
&&&&&&&&&&&&/*********************************************************
&&&&&&&&&&&&把alipayapi.php中复制过来的如下两段代码去掉,
&&&&&&&&&&&&第一段是引入配置项,
&&&&&&&&&&&&第二段是引入submit.class.php这个类。
&&&&&&&&&&&为什么要去掉??
&&&&&&&&&&&&第一,配置项的内容已经在项目的Config.php文件中进行了配置,我们只需用C函数进行调用即可;
&&&&&&&&&&&&第二,这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入;所以这里不再需要;
&&&&&&&&&&&&*****************************************************/
&&&&&&&//&require_once(&alipay.config.php&);
&&&&&&&//&require_once(&lib/alipay_submit.class.php&);
&&&&&&&//这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
&&&&&&&$alipay_config=C('alipay_config');&&
&&&&&&&&/**************************请求参数**************************/
&&&&&&&&$payment_type&=&&1&;&//支付类型&//必填,不能修改
&&&&&&&&$notify_url&=&C('alipay.notify_url');&//服务器异步通知页面路径
&&&&&&&&$return_url&=&C('alipay.return_url');&//页面跳转同步通知页面路径
&&&&&&&&$seller_email&=&C('alipay.seller_email');//卖家支付宝帐户必填
&&&&&&&&$out_trade_no&=&$_POST['trade_no'];//商户订单号&通过支付页面的表单进行传递,注意要唯一!
&&&&&&&&$subject&=&$_POST['ordsubject'];&&//订单名称&//必填&通过支付页面的表单进行传递
&&&&&&&&$total_fee&=&$_POST['ordtotal_fee'];&&&//付款金额&&//必填&通过支付页面的表单进行传递
&&&&&&&&$body&=&$_POST['ordbody'];&&//订单描述&通过支付页面的表单进行传递
&&&&&&&&$show_url&=&$_POST['ordshow_url'];&&//商品展示地址&通过支付页面的表单进行传递
&&&&&&&&$anti_phishing_key&=&&&;//防钓鱼时间戳&//若要使用请调用类文件submit中的query_timestamp函数
&&&&&&&&$exter_invoke_ip&=&get_client_ip();&//客户端的IP地址&
&&&&&&&&/************************************************************/
&&&&&&&&//构造要请求的参数数组,无需改动
&&&&$parameter&=&array(
&&&&&&&&&service&&=&&&create_direct_pay_by_user&,
&&&&&&&&&partner&&=&&trim($alipay_config['partner']),
&&&&&&&&&payment_type&&&&&=&&$payment_type,
&&&&&&&&&notify_url&&&&&=&&$notify_url,
&&&&&&&&&return_url&&&&&=&&$return_url,
&&&&&&&&&seller_email&&&&&=&&$seller_email,
&&&&&&&&&out_trade_no&&&&&=&&$out_trade_no,
&&&&&&&&&subject&&&&&=&&$subject,
&&&&&&&&&total_fee&&&&&=&&$total_fee,
&&&&&&&&&body&&&&&&&&&&&&&=&&$body,
&&&&&&&&&show_url&&&&&=&&$show_url,
&&&&&&&&&anti_phishing_key&&&&&=&&$anti_phishing_key,
&&&&&&&&&exter_invoke_ip&&&&&=&&$exter_invoke_ip,
&&&&&&&&&_input_charset&&&&&=&&trim(strtolower($alipay_config['input_charset']))
&&&&&&&&);
&&&&&&&&//建立请求
&&&&&&&&$alipaySubmit&=&new&AlipaySubmit($alipay_config);
&&&&&&&&$html_text&=&$alipaySubmit-&buildRequestForm($parameter,&post&,&&确认&);
&&&&&&&&echo&$html_
&&&&&&&&/******************************
&&&&&&&&服务器异步通知页面方法
&&&&&&&&其实这里就是将notify_url.php文件中的代码复制过来进行处理
&&&&&&&&*******************************/
&&&&function&notifyurl(){
&&&&&&&&&&&&&&&&/*
&&&&&&&&&&&&&&&&同理去掉以下两句代码;
&&&&&&&&&&&&&&&&*/&
&&&&&&&&&&&&&&&&//require_once(&alipay.config.php&);
&&&&&&&&&&&&&&&&//require_once(&lib/alipay_notify.class.php&);
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&//这里还是通过C函数来读取配置项,赋值给$alipay_config
&&&&&&&&$alipay_config=C('alipay_config');
&&&&&&&&//计算得出通知验证结果
&&&&&&&&$alipayNotify&=&new&AlipayNotify($alipay_config);
&&&&&&&&$verify_result&=&$alipayNotify-&verifyNotify();
&&&&&&&&if($verify_result)&{
&&&&&&&&&&&&&&&//验证成功
&&&&&&&&&&&&&&&&&&&//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
&&&&&&&&&&&$out_trade_no&&&=&$_POST['out_trade_no'];&&&&&&//商户订单号
&&&&&&&&&&&$trade_no&&&&&&&=&$_POST['trade_no'];&&&&&&&&&&//支付宝交易号
&&&&&&&&&&&$trade_status&&&=&$_POST['trade_status'];&&&&&&//交易状态
&&&&&&&&&&&$total_fee&&&&&&=&$_POST['total_fee'];&&&&&&&&&//交易金额
&&&&&&&&&&&$notify_id&&&&&&=&$_POST['notify_id'];&&&&&&&&&//通知校验ID。
&&&&&&&&&&&$notify_time&&&&=&$_POST['notify_time'];&&&&&&&//通知的发送时间。格式为yyyy-MM-dd&HH:mm:ss。
&&&&&&&&&&&$buyer_email&&&&=&$_POST['buyer_email'];&&&&&&&//买家支付宝帐号;
&&&&&&&&&&&&&&&&&&&$parameter&=&array(
&&&&&&&&&&&&&&out_trade_no&&&&&&=&&$out_trade_no,&//商户订单编号;
&&&&&&&&&&&&&&trade_no&&&&&&=&&$trade_no,&&&&&//支付宝交易号;
&&&&&&&&&&&&&&total_fee&&&&&&=&&$total_fee,&&&&//交易金额;
&&&&&&&&&&&&&&trade_status&&&&&&=&&$trade_status,&//交易状态
&&&&&&&&&&&&&&notify_id&&&&&&=&&$notify_id,&&&&//通知校验ID。
&&&&&&&&&&&&&&notify_time&&&&=&&$notify_time,&&//通知的发送时间。
&&&&&&&&&&&&&&buyer_email&&&&=&&$buyer_email,&&//买家支付宝帐号;
&&&&&&&&&&&);
&&&&&&&&&&&if($_POST['trade_status']&==&'TRADE_FINISHED')&{
&&&&&&&&&&&&&&&&&&&&&&&//
&&&&&&&&&&&}else&if&($_POST['trade_status']&==&'TRADE_SUCCESS')&{&&&&&&&&&&&&&&&&&&&&&&&&&&&if(!checkorderstatus($out_trade_no)){
&&&&&&&&&&&&&&&orderhandle($parameter);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&//进行订单处理,并传送从支付宝返回的参数;
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&echo&&success&;&&&&&&&&//请不要修改或删除
&&&&&&&&&}else&{
&&&&&&&&&&&&&&&&//验证失败
&&&&&&&&&&&&&&&&echo&&fail&;
&&&&&&&&}&&&&
&&&&&&&&页面跳转处理方法;
&&&&&&&&这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;&
&&&&&&&&*/
&&&&function&returnurl(){
&&&&&&&&&&&&&&&&//头部的处理跟上面两个方法一样,这里不罗嗦了!
&&&&&&&&$alipay_config=C('alipay_config');
&&&&&&&&$alipayNotify&=&new&AlipayNotify($alipay_config);//计算得出通知验证结果
&&&&&&&&$verify_result&=&$alipayNotify-&verifyReturn();
&&&&&&&&if($verify_result)&{
&&&&&&&&&&&&//验证成功
&&&&&&&&&&&&//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
&&&&&&&&$out_trade_no&&&=&$_GET['out_trade_no'];&&&&&&//商户订单号
&&&&&&&&$trade_no&&&&&&&=&$_GET['trade_no'];&&&&&&&&&&//支付宝交易号
&&&&&&&&$trade_status&&&=&$_GET['trade_status'];&&&&&&//交易状态
&&&&&&&&$total_fee&&&&&&=&$_GET['total_fee'];&&&&&&&&&//交易金额
&&&&&&&&$notify_id&&&&&&=&$_GET['notify_id'];&&&&&&&&&//通知校验ID。
&&&&&&&&$notify_time&&&&=&$_GET['notify_time'];&&&&&&&//通知的发送时间。
&&&&&&&&$buyer_email&&&&=&$_GET['buyer_email'];&&&&&&&//买家支付宝帐号;
&&&&&&&&&&&&
&&&&&&&&$parameter&=&array(
&&&&&&&&&&&&&out_trade_no&&&&&&=&&$out_trade_no,&&&&&&//商户订单编号;
&&&&&&&&&&&&&trade_no&&&&&&=&&$trade_no,&&&&&&&&&&//支付宝交易号;
&&&&&&&&&&&&&total_fee&&&&&&&=&&$total_fee,&&&&&&&&&//交易金额;
&&&&&&&&&&&&&trade_status&&&&&&=&&$trade_status,&&&&&&//交易状态
&&&&&&&&&&&&&notify_id&&&&&&&=&&$notify_id,&&&&&&&&&//通知校验ID。
&&&&&&&&&&&&&notify_time&&&&&=&&$notify_time,&&&&&&&//通知的发送时间。
&&&&&&&&&&&&&buyer_email&&&&&=&&$buyer_email,&&&&&&&//买家支付宝帐号
&&&&&&&&);
if($_GET['trade_status']&==&'TRADE_FINISHED'&||&$_GET['trade_status']&==&'TRADE_SUCCESS')&{
&&&&&&&&if(!checkorderstatus($out_trade_no)){
&&&&&&&&&&&&&orderhandle($parameter);&&//进行订单处理,并传送从支付宝返回的参数;
&&&&&&&&$this-&redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面;
&&&&}else&{
&&&&&&&&echo&&trade_status=&.$_GET['trade_status'];
&&&&&&&&$this-&redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面;
&&&&//验证失败
&&&&//如要调试,请看alipay_notify.php页面的verifyReturn函数
&&&&echo&&支付失败!&;
?&3、这里有几个支付处理过程中需要用到的函数,我把这些函数写到了项目的Common/common.php中,这样不用手动调用,即可直接使用这些函数,代码如下://////////////////////////////////////////////////////
//Orderlist数据表,用于保存用户的购买订单记录;
/*&Orderlist数据表结构;
CREATE&TABLE&`tb_orderlist`&(
&&`id`&int(11)&NOT&NULL&AUTO_INCREMENT,
&&`userid`&int(11)&DEFAULT&NULL,购买者userid
&&`username`&varchar(255)&DEFAULT&NULL,购买者姓名
&&`ordid`&varchar(255)&DEFAULT&NULL,订单号
&&`ordtime`&int(11)&DEFAULT&NULL,订单时间
&&`productid`&int(11)&DEFAULT&NULL,产品ID
&&`ordtitle`&varchar(255)&DEFAULT&NULL,订单标题
&&`ordbuynum`&int(11)&DEFAULT&'0',购买数量
&&`ordprice`&float(10,2)&DEFAULT&'0.00',产品单价
&&`ordfee`&float(10,2)&DEFAULT&'0.00',订单总金额
&&`ordstatus`&int(11)&DEFAULT&'0',订单状态
&&`payment_type`&varchar(255)&DEFAULT&NULL,支付类型
&&`payment_trade_no`&varchar(255)&DEFAULT&NULL,支付接口交易号
&&`payment_trade_status`&varchar(255)&DEFAULT&NULL,支付接口返回的交易状态
&&`payment_notify_id`&varchar(255)&DEFAULT&NULL,
&&`payment_notify_time`&varchar(255)&DEFAULT&NULL,
&&`payment_buyer_email`&varchar(255)&DEFAULT&NULL,
&&`ordcode`&varchar(255)&DEFAULT&NULL,&&&&&&&//这个字段不需要的,大家看我西面的修正补充部分的说明!
&&`isused`&int(11)&DEFAULT&'0',
&&`usetime`&int(11)&DEFAULT&NULL,
&&`checkuser`&int(11)&DEFAULT&NULL,
&&PRIMARY&KEY&(`id`)
)&ENGINE=MyISAM&AUTO_INCREMENT=5&DEFAULT&CHARSET=utf8;
//在线交易订单支付处理函数
//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
//返回值:如果订单已经成功支付,返回true,否则返回false;
function&checkorderstatus($ordid){
&&&&$Ord=M('Orderlist');
&&&&$ordstatus=$Ord-&where('ordid='.$ordid)-&getField('ordstatus');
&&&&if($ordstatus==1){
&&&&&&&&return&
&&&&}else{
&&&&&&&&return&&&&&
//处理订单函数
//更新订单状态,写入订单支付后返回的数据
function&orderhandle($parameter){
&&&&$ordid=$parameter['out_trade_no'];
&&&&$data['payment_trade_no']&&&&&&=$parameter['trade_no'];
&&&&$data['payment_trade_status']&&=$parameter['trade_status'];
&&&&$data['payment_notify_id']&&&&&=$parameter['notify_id'];
&&&&$data['payment_notify_time']&&&=$parameter['notify_time'];
&&&&$data['payment_buyer_email']&&&=$parameter['buyer_email'];
&&&&$data['ordstatus']&&&&&&&&&&&&&=1;
&&&&$Ord=M('Orderlist');
&&&&$Ord-&where('ordid='.$ordid)-&save($data);
/*-----------------------------------
下面这个函数,其实不需要,大家可以把他删掉,
具体看我下面的修正补充部分的说明
------------------------------------*/
//获取一个随机且唯一的订单号;
function&getordcode(){
&&&&$Ord=M('Orderlist');
&&&&$numbers&=&range&(10,99);
&&&&shuffle&($numbers);&
&&&&$code=array_slice($numbers,0,4);&
&&&&$ordcode=$code[0].$code[1].$code[2].$code[3];
&&&&$oldcode=$Ord-&where(&ordcode='&.$ordcode.&'&)-&getField('ordcode');
&&&&if($oldcode){
&&&&&&&&getordcode();
&&&&}else{
&&&&&&&&return&$
}四、总结几点
1、接口包中lib文件中的文件复制到Vendor后,重命名为TP规范的命名规则,为的是调用方便,当然你要改成其他名称也可以;
2、把执行支付操作(doalipay),处理异步返回结果(notifyurl),处理跳转返回结果(returnurl)三个支付接口的核心页面写到一个PayAction控制器中。
3、提交支付的页面中,可以在提交之前先把一些参数要传递的内容先通过隐藏域的方法组合好,比如金额先计算好,订单名称,订单描述等先用字符串组合好。然后提交表单,这样,在doalipay方法中只要直接构造传递参数,直接进行提交就行过了。
4、支付返回后的处理因为要在异步和跳转两个方法中都要进行相应的判断和处理,所以,把这些判断和处理写到一个自定义函数中,这样只要调用函数即可,使得代码更加清晰明了。
5、notify_url和return_url两种模式的返回url必须使用http://xxxxxxx这样的绝对路径,因为里是从支付宝平台返回到你的项目页面。不能使用相对路径。
以上代码在ThinkPHP3.0中正常使用!!
------------------------修正补充!!------------------------------
在第三部分中Orderlist数据表结构中,我有一个字段是OrdCode,这个字段是我系统中用来发送短信给客户的消费密码,也就是客户凭手机短信来消费时就要验证这个字段。
其实,大家在做系统的时候,可以把这个字段忽略,可以不用他。代码最后部分中,有一个获取一个随机且唯一的订单号的函数 getordcode(),这里我其实写错了,不是获取订单号,是ordcode,也就是消费密码,这个函数也不需要。系统中的订单号(ordid字段),我用的是时间戳。
在此修正!
--------------------解决签名错误问题 修正 13-08-16------------------------
有人说在在调试时,签名出现无法通过的问题,产生问题的原因是在返回的URL地址中返回的参数中,可能存在__URL__这样的字符串。导致无法正确过滤参数。
在向支付宝提交需要的参数时,不要使用__URL__,__PUBLIC__等TP中的模版替换变量,如果TP对这些变量解析不成功,会直接传递过去,所以,在这些地方直接使用原始的URL地址。
在接口的Core文件中,加入改造后的过滤函数,如下:/**
&*&除去数组中的空值和签名参数
&*&@param&$para&签名参数组
&*&return&去掉空值与签名参数后的新签名参数组
function&paraFilter($para)&{
&&&&$para_filter&=&array();
&&&&while&(list&($key,&$val)&=&each&($para))&{
&&&&&&&&if($key&==&&sign&&||&$key&==&&sign_type&&||&$key&==&'_URL_'&||&$val&==&&&)&&&&//添加了$key&==&'_URL_'&
&&&&&&&&else&&&&$para_filter[$key]&=&$para[$key];
&&&&return&$para_
function&myparaFilter($para)&{
&&&&$para_filter&=&array();
&&&&while&(list&($key,&$val)&=&each&($para))&{
&&&&&&&&if($key&==&'_URL_')
&&&&&&&&else&$para_filter[$key]&=&$para[$key];
&&&&return&$para_
=============================================
作为一个程序猿,分享一直是我秉承的理念,坚持开源和免费,与大家在WEB开发方面共同进步!
如果您对我的成果表示认同并且觉得对你有所帮助,您可以对我提供捐赠^_^。
支付宝捐赠:
用手机扫描二位码支付
谢谢您的支持!!
积分:6334
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。请问available ex stock,the subject to prior sales怎么翻译
微笑爱哥哥386
可用的外部库存,可在销售前发货.
为您推荐:
其他类似问题
超前股,就得预先售出.
可利用的除了库存,需要提前销售!
目前的股票,须事先销售
扫描下载二维码shiro:每次页面request,SecurityUtils.getSubject() 返回不同的值 - 开源中国社区
当前访客身份:游客 [
当前位置:
你好,想跟你请教个问题:
jfinal整合shiro,shiro权限的使用中,每次页面request,SecurityUtils.getSubject()&得到的subject 不一样,
SecurityUtils.java & & public static Subject getSubject() { & & & & Subject subject = ThreadContext.getSubject(); & & & & if (subject == null) { & & & & & & subject = (new Subject.Builder()).buildSubject(); & & & & & & ThreadContext.bind(subject); & & & & } & & & & & & }
ThreadContext.java & & public static final String SUBJECT_KEY = ThreadContext.class.getName() + &_SUBJECT_KEY&; & & public static Subject getSubject() { & & & & return (Subject) get(SUBJECT_KEY); & & }
因为每次页面过来的request都会是一个不同的thread,所以 SUBJECT_KEY 不一样,得到subject不一样,&权限检测这样就出问题了,subject是按线程保持,shiro有自定义的subject可以线程共享,但仍没搞明白,如何同一用户取到一样的subject?谢谢~
共有10个答案
<span class="a_vote_num" id="a_vote_num_
&!-- shiro
&listener&
&listener-class&org.apache.shiro.web.env.EnvironmentLoaderListener&/listener-class&
&/listener&
&filter-name&shiro&/filter-name&
&filter-class&org.apache.shiro.web.servlet.ShiroFilter&/filter-class&
&init-param&
&param-name&staticSecurityManagerEnabled&/param-name&
&param-value&true&/param-value&
&/init-param&
&filter-mapping&
&filter-name&shiro&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
@andylive&这一段放在最上面,在JFinal 之前
--- 共有 2 条评论 ---
: 我说我咋没碰到过呢,原来是顺序问题
(2年前)&nbsp&
问题在这里。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
ServletContext servletContext = ;
WebEnvironment webEnv = WebUtils.getRequiredWebEnvironment(servletContext);
org.apache.shiro.mgt.SecurityManager sm = webEnv.getWebSecurityManager();
SecurityUtils.setSecurityManager(sm);
Subject subject = SecurityUtils.getSubject();
这样获取试试
<span class="a_vote_num" id="a_vote_num_
这段代码放在哪里?只是获取的地方用吗?只是获取的地方不行啊,还是拿到的不同,只有相同的线程id才能拿到,我已经崩溃了。。。
<span class="a_vote_num" id="a_vote_num_
介绍两篇关于 jfinal 整合 shiro 的博文给你:
--- 共有 1 条评论 ---
嗯,参考的,非常感谢 ,
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
引用来自“eyelee”的答案
ServletContext servletContext = ;
WebEnvironment webEnv = WebUtils.getRequiredWebEnvironment(servletContext);
org.apache.shiro.mgt.SecurityManager sm = webEnv.getWebSecurityManager();
SecurityUtils.setSecurityManager(sm);
Subject subject = SecurityUtils.getSubject();
这样获取试试
程序初始化的时候按照你的思路,再加上ThreadContext.bind
SecurityUtils.getSubject()
方法,这个问题解决了。
--- 共有 4 条评论 ---
ThreadContext.bind(SecurityUtils.getSubject());
Subject suject = SecurityUtils.getSubject();
可以得到同一个subject了。
(3年前)&nbsp&
Subject subject = ThreadContext.getSubject();
这个试试~~
(3年前)&nbsp&
啊,官方文档我看的不够仔细吧。谢谢~
(3年前)&nbsp&
我这个是官方文档给出的~~~
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
多个用户登录,每个用户拿到的subject,都是被最后一个用户给改写。。。加bind()改也是错的。。
<span class="a_vote_num" id="a_vote_num_
index的请求没有走 filter.
JFinal action report --------
17:49:22 ------------------------------ Controller &: com.pos.controller.LoginController.(LoginController.java:1) Method & & &: index Interceptor : com.jfinal.ext.plugin.shiro.ShiroInterceptor.(ShiroInterceptor.java:1) -------------------------------------------------------------------------------- [INFO ] 08-02 17:49:22.570 [qtp] c.j.e.p.shiro.ShiroInterceptor:36 & - ShiroInterceptor call intercept() currentTread: qtp getSubject() is null buildSubjecte!& [INFO ] 08-02 17:49:41.171 [qtp] c.p.controller.LoginController:44 & - LoginController call index() currentTread: qtp [INFO ] 08-02 17:49:41.649 [qtp] & com.jfinal.core.JFinalFilter:70 & - JFinalFilter call doFilter() currentTread: qtp [INFO ] 08-02 17:49:47.608 [qtp] o.a.s.s.m.AbstractValidatingSessionManager:230 &- Enabling session validation scheduler... [INFO ] 08-02 17:49:47.623 [qtp] o.a.s.c.ehcache.EhCacheManager:170 &- Using existing EHCache named [shiro-activeSessionCache] [INFO ] 08-02 17:49:59.782 [qtp] &o.a.s.w.s.AbstractShiroFilter:360 &- AbstractShiroFilter call doFilterInternal!
这个web.xml配置对吗?
&?xml version=&1.0& encoding=&UTF-8&?&
&web-app xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns=&/xml/ns/javaee& xmlns:web=&/xml/ns/javaee/web-app_2_5.xsd&
xsi:schemaLocation=&/xml/ns/javaee /xml/ns/javaee/web-app_3_0.xsd&
id=&WebApp_ID& version=&3.0&&
&filter-name&jfinal&/filter-name&
&filter-class&com.jfinal.core.JFinalFilter&/filter-class&
&init-param&
&param-name&configClass&/param-name&
&param-value&com.pos.config.PosConfig&/param-value&
&/init-param&
&filter-mapping&
&filter-name&jfinal&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
& & &!-- shiro &--&
&listener&
&listener-class&org.apache.shiro.web.env.EnvironmentLoaderListener&/listener-class&
&/listener&
&filter-name&shiro&/filter-name&
&filter-class&org.apache.shiro.web.servlet.ShiroFilter&/filter-class&
& & & & &init-param&
& & & &&param-name&staticSecurityManagerEnabled&/param-name&
& & & &&param-value&true&/param-value&
& &&/init-param&
&filter-mapping&
&filter-name&shiro&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&/web-app&
<span class="a_vote_num" id="a_vote_num_
<span class="a_vote_num" id="a_vote_num_
<span class="a_vote_num" id="a_vote_num_
请教下:如果我需要在public void sessionDestroyed(HttpSessionEvent arg0)方法里获取Subject该如何弄呢?
在Controller里获取没问题,就是在HttpSessionListener里就取不到。
目前获取不到,总是Null
也尝试过org.apache.shiro.session.SessionListener实现会话监听,一直没弄成功,测试发现只有onStart被触发,onExpiration,onStop没动静,等等会话过期之后,刷新页面就获取不到会话数值导致出错
更多开发者职位上
有什么技术问题吗?
类似的话题}

我要回帖

更多关于 能不能给我发一个 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信