Java Alfresco webscript-401未经授权

Java Alfresco webscript-401未经授权,java,alfresco,alfresco-share,web-scripting,alfresco-webscripts,Java,Alfresco,Alfresco Share,Web Scripting,Alfresco Webscripts,我在露天执行wbesciptr时遇到问题。我不知道发生了什么,但每次我运行用java编写的webscript时,都会得到401个错误代码。我用javascript编写了Similar webscript,运行正常 地址: 错误日志: 2015-10-23 09:32:35030信息[web.site.EditionInterceptor][http-bio-8080-exec-7]无法从Alfresco检索许可证信息:401 我的xml bean: <bean id="webscript

我在露天执行wbesciptr时遇到问题。我不知道发生了什么,但每次我运行用java编写的webscript时,都会得到401个错误代码。我用javascript编写了Similar webscript,运行正常

地址:

错误日志:

2015-10-23 09:32:35030信息[web.site.EditionInterceptor][http-bio-8080-exec-7]无法从Alfresco检索许可证信息:401

我的xml bean:

<bean id="webscript.pl.[...].ca.guest.my-captcha.get"
    class="pl.[...].repo.web.scripts.ca.MyCaptcha" 
    parent="webscript">
</bean>

xml格式的属性:

<webscript>
    <shortname>My captcha</shortname>
    <description>Get captcha</description>
    <url>/api/ca/guest/my-captcha</url>
    <format default="json"/>
    <family>[...]</family>
    <authentication runas="admin">none</authentication>
</webscript>

我的验证码
获取验证码
/api/ca/guest/my验证码
[...]
没有一个
FTL:

{
“令牌”:“${token}”为空,
“响应”:“${response}”为空,
“图像”:“${image}”为空
}
和JAVA类:

public class MyCaptcha extends DeclarativeWebScript {

    private static final Logger LOGGER = Logger.getLogger(MyCaptcha.class);
    private static final String CAPTCHA_VALIDATE = "validate";
    private static final String CAPTCHA_CREATE = "create";
    private static final String PARAMETER_TYPE = "type";
    private static final String PARAMETER_TOKEN = "token";
    private static final String PARAMETER_WORD = "word";
    private static final String PARAMETER_IMAGE = "image";
    private static final String PARAMETER_RESPONSE = "response";
    private static Map<String, String> TOKENCACHE = new HashMap<>();

    @Override
    protected Map<String, Object> executeImpl(WebScriptRequest req,
            Status status, Cache cache) {
        Map<String, Object> result;
        String request = req.getParameter(PARAMETER_TYPE);
        if (request != null && request.equals(CAPTCHA_CREATE)) {
            result = createCaptcha();
            return result;
        } else if (request != null && request.equals(CAPTCHA_VALIDATE)) {
            String token = req.getParameter(PARAMETER_TOKEN);
            String word = req.getParameter(PARAMETER_WORD);
            result = new HashMap<>();
            result.put(PARAMETER_RESPONSE, token != null && word != null
                    && TOKENCACHE.get(token).equalsIgnoreCase(word)
                    ? "true"
                    : "false");
            return result;
        } else {
            result = new HashMap<>();
            result.put(PARAMETER_RESPONSE, "false");
            return result;
        }
    }

    public Map<String, Object> createCaptcha() {
        int width = 150;
        int height = 50;
        BufferedImage bufferedImage = new BufferedImage(150, 50,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = bufferedImage.createGraphics();
        g2d.setFont(new Font("Georgia", Font.BOLD, 18));

        RenderingHints renderingHints = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        renderingHints.put(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);

        g2d.setRenderingHints(renderingHints);

        // drawing gradient
        GradientPaint gp = new GradientPaint(0, 0, Color.lightGray, 0,
                height / 1, Color.white, true);

        g2d.setPaint(gp);
        g2d.fillRect(0, 0, width, height);

        // setting font's color
        g2d.setColor(new Color(0, 0, 0));

        // creating chain of random letters
        char captchaWord[] = new char[6];
        String captcha = "";
        Random r = new Random();
        for (int i = 0; i < 6; i++) {
            captchaWord[i] = (char) (65 + Math.abs(r.nextInt()) % 24);
            captcha += captchaWord[i];
        }

        // drawing chain of random letters on image
        int x = 0;
        for (int i = 0; i < captchaWord.length; i++) {
            x += 10 + (Math.abs(r.nextInt()) % 15);
            g2d.drawChars(captchaWord, i, 1, x + 5,
                    20 + Math.abs(r.nextInt()) % 20);
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // OutputStream b64 = new Base64.OutputStream(baos);
        Map<String, Object> result = new HashMap<>();
        try {
            ImageIO.write(bufferedImage, "png", baos);
            byte[] bytes = baos.toByteArray();
            String base64bytes = Base64.encodeBytes(bytes);
            String src = "data:image/png;base64," + base64bytes;
            String token = createToken(captcha);
            result.put(PARAMETER_IMAGE, src); // b64.toString("UTF-8"));
            result.put(PARAMETER_TOKEN, token);
            TOKENCACHE.put(token, captcha);
            return result;
        } catch (IOException e) {
            LOGGER.error("Exception : can't write image into base64 ::", e);
            // ? e.printStackTrace();
            result.put("error", "can't write image into base64");
            return result;
        }
    }

    // this function creates unique (hope so) token to recognize captcha
    public String createToken(String captcha) {
        StringBuffer token = new StringBuffer();
        Date date = new Date();
        Random r = new Random();
        token.append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append(date.getTime());
        return token.toString();
    }
}
公共类MyCaptcha扩展了DeclarativeWebScript{
私有静态最终记录器Logger=Logger.getLogger(MyCaptcha.class);
私有静态最终字符串验证码\u VALIDATE=“VALIDATE”;
私有静态最终字符串验证码\u CREATE=“CREATE”;
私有静态最终字符串参数\u TYPE=“TYPE”;
私有静态最终字符串参数\u TOKEN=“TOKEN”;
私有静态最终字符串参数\u WORD=“WORD”;
私有静态最终字符串参数\u IMAGE=“IMAGE”;
私有静态最终字符串参数\u RESPONSE=“RESPONSE”;
私有静态映射令牌缓存=新HashMap();
@凌驾
受保护的映射executeImpl(WebScript请求请求,
状态(缓存状态){
地图结果;
字符串请求=req.getParameter(参数类型);
if(request!=null&&request.equals(验证码创建)){
结果=createCaptcha();
返回结果;
}else if(request!=null&&request.equals(验证码验证)){
字符串标记=req.getParameter(参数\u标记);
字符串字=req.getParameter(参数字);
结果=新的HashMap();
result.put(参数\响应,令牌!=null&&word!=null
&&令牌缓存.get(令牌).equalsIgnoreCase(word)
“正确”
:“假”);
返回结果;
}否则{
结果=新的HashMap();
结果。put(参数_响应,“false”);
返回结果;
}
}
公共地图createCaptcha(){
整数宽度=150;
整数高度=50;
BuffereImage BuffereImage=新的BuffereImage(150,50,
BuffereImage.TYPE_INT_RGB);
Graphics2D g2d=bufferedImage.createGraphics();
g2d.setFont(新字体(“Georgia”,Font.BOLD,18));
RenderingHints RenderingHints=新的RenderingHints(
RenderingHists.KEY\u抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
renderinghits.put(renderinghits.KEY_RENDERING,
渲染提示。值(渲染质量);
g2d.setRenderingHints(renderingHints);
//拉深梯度
GradientPaint gp=新的GradientPaint(0,0,颜色。浅灰色,0,
高度/1,颜色。白色,真实);
g2d.setPaint(总成);
g2d.fillRect(0,0,宽度,高度);
//设置字体的颜色
设置颜色(新颜色(0,0,0));
//创建随机字母链
字符captchaWord[]=新字符[6];
字符串验证码=”;
随机r=新随机();
对于(int i=0;i<6;i++){
captchaWord[i]=(char)(65+Math.abs(r.nextInt())%24);
验证码+=验证码字[i];
}
//在图像上绘制随机字母链
int x=0;
for(int i=0;i
我解决了(幸运的是)。地址有问题。我使用代理调用我的webscript,而不是直接连接到/service/../my captcha

public class MyCaptcha extends DeclarativeWebScript {

    private static final Logger LOGGER = Logger.getLogger(MyCaptcha.class);
    private static final String CAPTCHA_VALIDATE = "validate";
    private static final String CAPTCHA_CREATE = "create";
    private static final String PARAMETER_TYPE = "type";
    private static final String PARAMETER_TOKEN = "token";
    private static final String PARAMETER_WORD = "word";
    private static final String PARAMETER_IMAGE = "image";
    private static final String PARAMETER_RESPONSE = "response";
    private static Map<String, String> TOKENCACHE = new HashMap<>();

    @Override
    protected Map<String, Object> executeImpl(WebScriptRequest req,
            Status status, Cache cache) {
        Map<String, Object> result;
        String request = req.getParameter(PARAMETER_TYPE);
        if (request != null && request.equals(CAPTCHA_CREATE)) {
            result = createCaptcha();
            return result;
        } else if (request != null && request.equals(CAPTCHA_VALIDATE)) {
            String token = req.getParameter(PARAMETER_TOKEN);
            String word = req.getParameter(PARAMETER_WORD);
            result = new HashMap<>();
            result.put(PARAMETER_RESPONSE, token != null && word != null
                    && TOKENCACHE.get(token).equalsIgnoreCase(word)
                    ? "true"
                    : "false");
            return result;
        } else {
            result = new HashMap<>();
            result.put(PARAMETER_RESPONSE, "false");
            return result;
        }
    }

    public Map<String, Object> createCaptcha() {
        int width = 150;
        int height = 50;
        BufferedImage bufferedImage = new BufferedImage(150, 50,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = bufferedImage.createGraphics();
        g2d.setFont(new Font("Georgia", Font.BOLD, 18));

        RenderingHints renderingHints = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        renderingHints.put(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);

        g2d.setRenderingHints(renderingHints);

        // drawing gradient
        GradientPaint gp = new GradientPaint(0, 0, Color.lightGray, 0,
                height / 1, Color.white, true);

        g2d.setPaint(gp);
        g2d.fillRect(0, 0, width, height);

        // setting font's color
        g2d.setColor(new Color(0, 0, 0));

        // creating chain of random letters
        char captchaWord[] = new char[6];
        String captcha = "";
        Random r = new Random();
        for (int i = 0; i < 6; i++) {
            captchaWord[i] = (char) (65 + Math.abs(r.nextInt()) % 24);
            captcha += captchaWord[i];
        }

        // drawing chain of random letters on image
        int x = 0;
        for (int i = 0; i < captchaWord.length; i++) {
            x += 10 + (Math.abs(r.nextInt()) % 15);
            g2d.drawChars(captchaWord, i, 1, x + 5,
                    20 + Math.abs(r.nextInt()) % 20);
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // OutputStream b64 = new Base64.OutputStream(baos);
        Map<String, Object> result = new HashMap<>();
        try {
            ImageIO.write(bufferedImage, "png", baos);
            byte[] bytes = baos.toByteArray();
            String base64bytes = Base64.encodeBytes(bytes);
            String src = "data:image/png;base64," + base64bytes;
            String token = createToken(captcha);
            result.put(PARAMETER_IMAGE, src); // b64.toString("UTF-8"));
            result.put(PARAMETER_TOKEN, token);
            TOKENCACHE.put(token, captcha);
            return result;
        } catch (IOException e) {
            LOGGER.error("Exception : can't write image into base64 ::", e);
            // ? e.printStackTrace();
            result.put("error", "can't write image into base64");
            return result;
        }
    }

    // this function creates unique (hope so) token to recognize captcha
    public String createToken(String captcha) {
        StringBuffer token = new StringBuffer();
        Date date = new Date();
        Random r = new Random();
        token.append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append((char) (65 + Math.abs(r.nextInt()) % 24))
                .append(date.getTime());
        return token.toString();
    }
}