NutzCN Logo
问答 论坛app登录后如何让webview也处于登陆状态?
发布于 234天前 作者 书生 216 次浏览 复制 上一个帖子 下一个帖子
标签: app webview android
public class AccessTokenFilter extends AbstractProcessor implements ActionFilter {
	
	private static final Log log = Logs.get();
	
	YvrService yvrService;

	public View match(ActionContext ac) {
		if (yvrService == null)
			yvrService = ac.getIoc().get(YvrService.class);
		HttpServletRequest req = ac.getRequest();
		String at = req.getParameter("accesstoken");
		if (req.getHeader("Api-Version") != null) {
			log.debug("api version = " + req.getHeader("Api-Version"));
			String loginname = req.getHeader("Api-Loginname");
			String nonce = req.getHeader("Api-Nonce");
			String key = req.getHeader("Api-Key");
			String time = req.getHeader("Api-Time");
			if (Strings.isBlank(loginname) || Strings.isBlank(nonce) || Strings.isBlank(key) || Strings.isBlank(time)) {
				return BaseModule.HTTP_403;
			}
			if (!yvrService.checkNonce(nonce, time)){
				return BaseModule.HTTP_403;
			}
			at = yvrService.accessToken(loginname);
			if (Strings.isBlank(at)) {
				return BaseModule.HTTP_403;
			}
			String tmp = Strings.join(",", at, loginname, nonce, time);
			String _key = Lang.sha1(tmp);
			log.debug("tmp="+tmp);
			log.debug("_key=" + _key);
			log.debug(" key=" + key);
			if (!_key.equals(key)) {
				return BaseModule.HTTP_403;
			}
			log.debug("api access token check ok");
		} 
		else if (Strings.isBlank(at)) { // TODO 移除这种兼容性,改成必须用nonce加密
			return BaseModule.HTTP_403;
		}
		int uid = yvrService.getUserByAccessToken(at);
		if (uid < 1) {
			return BaseModule.HTTP_403;
		}
		SecurityUtils.getSubject().getSession().setAttribute("me", uid);
		return null;
	}
@POST
	@At("/topics")
	@AdaptBy(type=WhaleAdaptor.class)
	@Filters(@By(type=AccessTokenFilter.class))
	public Object add(@Param("..")Topic topic, @Param("tab")String tab) {
		if (tab != null)
			topic.setType(TopicType.valueOf(tab));
		int userId = Toolkit.uid();
		CResult re = yvrService.add(topic, userId);
		if (re.isOk()) {
			return _map("success", true, "topic_id", re.as(String.class));
		} else {
			return _map("success", false, "message", re.getMsg());
		}
	}

@Filters(@By(type=AccessTokenFilter.class)) 这个过滤器的参数是 String at = req.getParameter("accesstoken"); 客户端里的每个web请求都需要把 accesstoken 字符串当做参数传入做验证?

如果 在客户端原生态登陆的时候调用 网页传递一个token,然后根据accesstoken检索账号,密码,然后做一次登陆设置session,这样,webview,是不是不用每次都传递accesstoken参数?

7 回复

如果你想做个webview且保持session状态,那就不要用access token这种方式了吧

另外,AccesstokenFilter实现了两种方式的,直接传access token的v1版,和不直接传access token,只传sign的
v2版.

AccesstokenFilter的第二种方式在哪里有实现,nutzbook里有吗?

@qq_97f5068e AccesstokenFilter里面就是,若只实现v1,何须那么多判断

String loginname = req.getHeader("Api-Loginname");
			String nonce = req.getHeader("Api-Nonce");
			String key = req.getHeader("Api-Key");
			String time = req.getHeader("Api-Time");

上面的代码只要穿这几个值或者直接改一下,只传sign结果就可以实现 了

直接传结果,省流量了

if (req.getHeader("Api-Version") != null) {
// 这里开始的都是v2
添加回复
请先登陆
回到顶部